Sign_In_Register/employee_manifest.py

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)