125 lines
5.6 KiB
Python
125 lines
5.6 KiB
Python
from tkinter import *
|
|
from tkinter import ttk
|
|
import pandas as pd
|
|
from lib import treerow_add, csvrow_add, treerow_del, csvrow_del, row_tracker
|
|
from tkinter import messagebox
|
|
|
|
class EmployeeManifest(Frame):
|
|
def __init__(self, parent, controller):
|
|
Frame.__init__(self, parent)
|
|
self.employeereg_columns = ['department','fname','sname','cardID']
|
|
|
|
#Data frames for list of departments and database of users
|
|
self.employee_df = pd.read_csv('employeeregister.csv', converters={'cardID': str})
|
|
self.department_df = pd.read_csv('departments.csv')
|
|
|
|
self.row_tracker = row_tracker(self.department_df, 0)
|
|
|
|
self.input_frame = Frame(self)
|
|
self.input_frame.grid(row=0, column=0, sticky='w')
|
|
|
|
self.firstname_label = Label(self.input_frame, text='First Name')
|
|
self.firstname_label.grid(row=0, column=0, padx=10, sticky="w")
|
|
self.firstname_text = Entry(self.input_frame)
|
|
self.firstname_text.grid(row=0, column=1, pady=5)
|
|
self.firstname_text.focus()
|
|
|
|
self.surname_label = Label(self.input_frame, text='Surname')
|
|
self.surname_label.grid(row=1, column=0, padx=10, sticky="w")
|
|
self.surname_text = Entry(self.input_frame)
|
|
self.surname_text.grid(row=1, column=1, pady=5)
|
|
|
|
self.card_label = Label(self.input_frame, text='Scan Card')
|
|
self.card_label.grid(row=2, column=0, padx=10, sticky="w")
|
|
self.card_text = Entry(self.input_frame)
|
|
self.card_text.grid(row=2, column=1, pady=5)
|
|
|
|
self.enter_btn = Button(self.input_frame, text='Enter Employee Info', command= lambda: self.write_line_csv(self.get_inputs()))
|
|
self.enter_btn.grid(row=3, column=0, pady=5, padx=10)
|
|
|
|
self.del_row_btn = Button(self.input_frame, text='Delete Employee(s)', command=self.delete_employees)
|
|
self.del_row_btn.grid(row=3, column=1, padx=10)
|
|
|
|
#create and store options for the department option menu
|
|
self.department_options = []
|
|
|
|
for rownum, row in self.department_df.iterrows():
|
|
self.department_options.append(row.Department)
|
|
|
|
#Create department option menu
|
|
self.value_inside = StringVar(self.input_frame)
|
|
self.value_inside.set("")
|
|
self.options_label = Label(self.input_frame, text='Department')
|
|
self.options_label.grid(row=0, column=2, padx=10)
|
|
self.department_options = OptionMenu(self.input_frame, self.value_inside, *self.department_options)
|
|
self.department_options.config(width=14)
|
|
self.department_options.grid(row=0, column=3, padx=(0, 10))
|
|
|
|
self.employee_register_tree = ttk.Treeview(self)
|
|
self.employee_register_tree.grid(column=0, row=4, padx=(10, 0), sticky="we")
|
|
self.employee_register_tree['columns'] = ('First Name', 'Surname', 'Card Code')
|
|
self.employee_register_tree.column('#0', width=120)
|
|
self.employee_register_tree.column('First Name', anchor=CENTER, width=110)
|
|
self.employee_register_tree.column('Surname', anchor=CENTER, width=110)
|
|
self.employee_register_tree.column('Card Code', anchor=CENTER, width=110)
|
|
|
|
#Define headings for each column
|
|
self.employee_register_tree.heading('#0', text='Department')
|
|
self.employee_register_tree.heading('First Name', text='First Name')
|
|
self.employee_register_tree.heading('Surname', text='Surname')
|
|
self.employee_register_tree.heading('Card Code', text='Card Code')
|
|
|
|
self.tree_scrollbar = Scrollbar(self, orient="vertical", command=self.employee_register_tree.yview)
|
|
self.employee_register_tree.configure(yscrollcommand=self.tree_scrollbar.set)
|
|
self.tree_scrollbar.grid(column=1,row=4, sticky='ns', pady=(0, 10))
|
|
|
|
for rownum, row in self.employee_df.iterrows():
|
|
treerow_add(self.row_tracker, self.employee_register_tree, row)
|
|
|
|
def delete_employees(self):
|
|
employees = self.employee_register_tree.selection()
|
|
|
|
#Prevent deletion of department parent row
|
|
for employee in employees:
|
|
if 'D' in employee:
|
|
return
|
|
|
|
delete_prompt = messagebox.askokcancel('Delete Users', 'Are you sure you wish to delete user(s)')
|
|
if delete_prompt == False:
|
|
return
|
|
|
|
#Delete user from tree and CSV
|
|
self.employee_df = csvrow_del('employeeregister.csv', self.employee_df, employees)
|
|
treerow_del(self.row_tracker, self.employee_register_tree, employees)
|
|
|
|
#Clear inputs of all fields
|
|
def clear_inputs(self, input_arr):
|
|
self.value_inside.set("")
|
|
|
|
for input in input_arr:
|
|
input.delete('0', END)
|
|
|
|
self.firstname_text.focus()
|
|
|
|
#Return array of inputs in all fields
|
|
def get_inputs(self):
|
|
inputs = [self.value_inside.get(), self.firstname_text.get(), self.surname_text.get(), self.card_text.get()]
|
|
return inputs
|
|
|
|
def write_line_csv(self, inputs):
|
|
#Field validation
|
|
for input in inputs:
|
|
if input == '':
|
|
messagebox.showerror('Validation Error', 'Please make sure all fields are completed')
|
|
return
|
|
|
|
for x in range(len(self.employee_df)):
|
|
if self.employee_df.iloc[x]['cardID'] == inputs[3]:
|
|
messagebox.showerror('Validation Error', 'Card ID must be unique for each employee')
|
|
return
|
|
|
|
self.clear_inputs([self.firstname_text, self.surname_text, self.card_text])
|
|
|
|
#Add user to tree and csv
|
|
treerow_add(self.row_tracker, self.employee_register_tree, inputs)
|
|
self.employee_df = csvrow_add('employeeregister.csv', self.employee_df, self.employeereg_columns, inputs) |