Advertisement
EagleSeeker

Untitled

Aug 8th, 2023
982
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.54 KB | None | 0 0
  1. import tkinter as tk
  2. import json
  3. from tkinter import ttk
  4. from datetime import datetime
  5. from tkcalendar import DateEntry
  6.  
  7.  
  8. class PayrollApp:
  9.     def __init__(self, root):
  10.         self.root = root
  11.         self.root.title("Payroll System")
  12.         self.root.geometry("1360x280")  # Set the initial window size
  13.  
  14.         # Initialize variables
  15.         self.records = []
  16.         self.editing_record = None
  17.  
  18.         # Create input fields
  19.         self.employee_var = tk.StringVar()
  20.         self.account_var = tk.StringVar()
  21.         self.bank_var = tk.StringVar()
  22.         self.gross_pay_var = tk.DoubleVar()
  23.  
  24.         self.employee_label = tk.Label(root, text="Employee:")
  25.         self.account_label = tk.Label(root, text="Account Number:")
  26.         self.bank_label = tk.Label(root, text="Bank Name:")
  27.         self.gross_pay_label = tk.Label(root, text="Gross Pay:")
  28.  
  29.         self.employee_entry = tk.Entry(root, textvariable=self.employee_var)
  30.         self.account_entry = tk.Entry(root, textvariable=self.account_var)
  31.         self.bank_entry = tk.Entry(root, textvariable=self.bank_var)
  32.         self.gross_pay_entry = tk.Entry(root, textvariable=self.gross_pay_var)
  33.  
  34.         self.calculate_button = tk.Button(root, text="Calculate Payroll", command=self.calculate_payroll)
  35.  
  36.         # Create records table
  37.         self.records_tree = ttk.Treeview(root, columns=("Date", "Employee", "Gross Pay", "Bank", "NSSF 10%", "NSSF 5%", "PAYE", "Net Pay"))
  38.         self.records_tree.heading("#1", text="Date")
  39.         self.records_tree.heading("#2", text="Employee")
  40.         self.records_tree.heading("#3", text="Gross Pay")
  41.         self.records_tree.heading("#4", text="Bank")
  42.         self.records_tree.heading("#5", text="NSSF 10%")
  43.         self.records_tree.heading("#6", text="NSSF 5%")
  44.         self.records_tree.heading("#7", text="PAYE")
  45.         self.records_tree.heading("#8", text="Net Pay")
  46.         self.records_tree.bind("<ButtonRelease-1>", self.select_record)
  47.  
  48.         # Adjust column widths for the records table
  49.         self.records_tree.column("#1", width=100)  # Date column
  50.         self.records_tree.column("#2", width=150)  # Employee column
  51.         self.records_tree.column("#3", width=100)
  52.         self.records_tree.column("#4", width=150)
  53.         self.records_tree.column("#5", width=100)
  54.         self.records_tree.column("#6", width=100)
  55.         self.records_tree.column("#7", width=100)
  56.         self.records_tree.column("#8", width=100)
  57.         # Edit and delete buttons
  58.         self.edit_button = tk.Button(root, text="Edit", command=self.edit_record)
  59.         self.delete_button = tk.Button(root, text="Delete", command=self.delete_record)
  60.  
  61.         # Load records from file when app starts
  62.         self.load_records_from_file('records.json')
  63.  
  64.         # Layout
  65.         self.employee_label.grid(row=0, column=0)
  66.         self.account_label.grid(row=1, column=0)
  67.         self.bank_label.grid(row=2, column=0)
  68.         self.gross_pay_label.grid(row=3, column=0)
  69.  
  70.         self.employee_entry.grid(row=0, column=1)
  71.         self.account_entry.grid(row=1, column=1)
  72.         self.bank_entry.grid(row=2, column=1)
  73.         self.gross_pay_entry.grid(row=3, column=1)
  74.  
  75.         self.calculate_button.grid(row=4, column=1)
  76.  
  77.         self.records_tree.grid(row=0, column=2, rowspan=5, padx=20, pady=10)
  78.  
  79.  
  80.  
  81.         #Edit and Delete poitions
  82.         self.edit_button.grid(row=5, column=2, sticky=tk.E, padx=20, pady=5)
  83.         self.delete_button.grid(row=5, column=2, sticky=tk.W, padx=20, pady=5)
  84.  
  85.         self.editing_record = None
  86.         self.edit_button.config(state=tk.DISABLED)
  87.         self.records_tree.bind("<ButtonRelease-1>", self.select_record)
  88.  
  89.  
  90.     def calculate_payroll(self):
  91.         employee_name = self.employee_var.get()
  92.         account_number = self.account_var.get()
  93.         bank_name = self.bank_var.get()
  94.         gross_pay = self.gross_pay_var.get()
  95.  
  96.         nssf_10 = gross_pay * 0.1
  97.         nssf_5 = gross_pay * 0.05
  98.  
  99.         # Perform basic PAYE calculation
  100.         if gross_pay <= 235000:
  101.             paye = 0
  102.         elif 235001 <= gross_pay <= 335000:
  103.             paye = (gross_pay - 235000) * 0.1
  104.         else:
  105.             paye = (gross_pay - 335000) * 0.2 + 10000
  106.  
  107.         net_pay = gross_pay - (nssf_10 + nssf_5 + paye)
  108.  
  109.         current_date = datetime.now().strftime("%Y-%m-%d")
  110.  
  111.         record = {
  112.             "Date": current_date,
  113.             "Employee": employee_name,
  114.             "Gross Pay": gross_pay,
  115.             "Bank": bank_name,
  116.             "NSSF 10%": nssf_10,
  117.             "NSSF 5%": nssf_5,
  118.             "PAYE": paye,
  119.             "Net Pay": net_pay
  120.         }
  121.  
  122.         self.records.append(record)
  123.         self.update_records_tree()
  124.  
  125.     def select_record(self, event):
  126.         selected_item = self.records_tree.selection()[0]
  127.         record_index = int(selected_item.split("I")[1])
  128.         self.editing_record = record_index
  129.         self.edit_button.config(state=tk.NORMAL)
  130.  
  131.     def save_records_to_file(self, filename):
  132.         with open(filename, 'w') as file:
  133.             json.dump(self.records, file)
  134.         self.root.destroy()
  135.  
  136.     def load_records_from_file(self, filename):
  137.         try:
  138.             with open(filename, 'r') as file:
  139.                 self.records = json.load(file)
  140.                 self.update_records_tree()
  141.         except FileNotFoundError:
  142.             self.records = []
  143.  
  144.     def edit_record(self):
  145.         if self.editing_record is not None:
  146.             edit_window = tk.Toplevel(self.root)
  147.             edit_window.title("Edit Record")
  148.  
  149.             # Create entry fields for editing
  150.             employee_edit_var = tk.StringVar(value=self.records[self.editing_record]["Employee"])
  151.             bank_edit_var = tk.StringVar(value=self.records[self.editing_record]["Bank"])
  152.             date_edit_var = tk.StringVar(value=self.records[self.editing_record]["Date"])
  153.  
  154.             employee_edit_label = tk.Label(edit_window, text="Employee:")
  155.             bank_edit_label = tk.Label(edit_window, text="Bank Name:")
  156.             date_edit_label = tk.Label(edit_window, text="Date:")
  157.  
  158.             employee_edit_entry = tk.Entry(edit_window, textvariable=employee_edit_var)
  159.             bank_edit_entry = tk.Entry(edit_window, textvariable=bank_edit_var)
  160.             date_edit_entry = tk.Entry(edit_window, textvariable=date_edit_var)
  161.  
  162.             # Create a function to save changes and close the edit window
  163.             def save_and_close():
  164.                 self.save_edited_record(employee_edit_var.get(), bank_edit_var.get(), date_edit_var.get())
  165.                 edit_window.destroy()
  166.  
  167.             save_button = tk.Button(edit_window, text="Save Changes", command=save_and_close)
  168.             # Create a DateEntry widget for date selection
  169.             date_edit_entry = DateEntry(edit_window, textvariable=date_edit_var, date_pattern='yyyy-mm-dd')
  170.  
  171.             employee_edit_label.grid(row=0, column=0)
  172.             employee_edit_entry.grid(row=0, column=1)
  173.             bank_edit_label.grid(row=1, column=0)
  174.             bank_edit_entry.grid(row=1, column=1)
  175.             date_edit_label.grid(row=2, column=0)
  176.             date_edit_entry.grid(row=2, column=1)
  177.             save_button.grid(row=3, column=1)
  178.  
  179.     def save_edited_record(self, new_employee, new_bank, new_date):
  180.         if self.editing_record is not None:
  181.             self.records[self.editing_record]["Employee"] = new_employee
  182.             self.records[self.editing_record]["Bank"] = new_bank
  183.             self.records[self.editing_record]["Date"] = new_date
  184.             self.editing_record = None
  185.             self.update_records_tree()
  186.  
  187.     def delete_record(self):
  188.         if self.editing_record is not None:
  189.             del self.records[self.editing_record]
  190.             self.editing_record = None
  191.             self.update_records_tree()
  192.  
  193.     def update_records_tree(self):
  194.         self.records_tree.delete(*self.records_tree.get_children())
  195.         for index, record in enumerate(self.records):
  196.             self.records_tree.insert("", "end", iid=f"I{index}", values=(
  197.                 record["Date"],
  198.                 record["Employee"],
  199.                 record["Gross Pay"],
  200.                 record["Bank"],
  201.                 record["NSSF 10%"],
  202.                 record["NSSF 5%"],
  203.                 record["PAYE"],
  204.                 record["Net Pay"]
  205.             ))
  206.  
  207.             self.edit_button.config(state=tk.DISABLED)
  208.  
  209.  
  210. def main():
  211.     root = tk.Tk()
  212.     app = PayrollApp(root)
  213.     root.protocol("WM_DELETE_WINDOW", lambda: app.save_records_to_file('records.json'))
  214.     root.mainloop()
  215.  
  216.  
  217. if __name__ == "__main__":
  218.     main()
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement