diff --git a/.idea/Zeiterfassung.iml b/.idea/Zeiterfassung.iml
index 909438d..68b5ff6 100644
--- a/.idea/Zeiterfassung.iml
+++ b/.idea/Zeiterfassung.iml
@@ -1,8 +1,10 @@
-
-
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index a6218fe..32d08e5 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
-
+
\ No newline at end of file
diff --git a/__pycache__/definitions.cpython-311.pyc b/__pycache__/definitions.cpython-311.pyc
index 0ba3c60..5c90a03 100644
Binary files a/__pycache__/definitions.cpython-311.pyc and b/__pycache__/definitions.cpython-311.pyc differ
diff --git a/definitions.py b/definitions.py
index 7ceebf2..28b6c83 100644
--- a/definitions.py
+++ b/definitions.py
@@ -1,5 +1,21 @@
# Zeiterfassung
-# Quasi-Konsten
+# Quasi-Konstanten
+
+import os
app_title = "Zeiterfassung"
-app_version = "0.0.0"
\ No newline at end of file
+app_version = ("0.0.0")
+
+# Standardpfade
+scriptpath = os.path.dirname(os.path.abspath(__file__))
+userfolder = "users"
+
+# Dateinamen
+
+usersettingsfilename = "settings.json"
+photofilename = "photo.png"
+
+# Status
+
+status_in = "eingestempelt"
+status_out = "ausgestempelt"
\ No newline at end of file
diff --git a/nice_gui.py b/nice_gui.py
new file mode 100644
index 0000000..5cc9439
--- /dev/null
+++ b/nice_gui.py
@@ -0,0 +1,23 @@
+# Zeiterfassung
+# Nice GUI UI
+
+from nicegui import ui
+from nicegui.events import ValueChangeEventArguments
+
+def site_pinpad():
+
+ keys = [
+ [ 1, 2, 3],
+ [ 4, 5, 6],
+ [ 7, 8, 9],
+ [ "<-", 0, "OK"]
+ ]
+
+ with ui.row():
+ for y, row in enumerate(keys, 1):
+ for x, key in enumerate(row):
+ button = ui.Button(text=keys[y][x])
+
+ ui.run(port=8090)
+
+site_pinpad()
\ No newline at end of file
diff --git a/nicegui_test.py b/nicegui_test.py
new file mode 100644
index 0000000..5db097b
--- /dev/null
+++ b/nicegui_test.py
@@ -0,0 +1,12 @@
+from nicegui import ui
+
+def pinpad():
+
+ def update_time():
+ string_time = strftime('%A, der %d.%m.%Y - %H:%M:%S')
+ nonlocal digital_clock
+ digital_clock
+ digital_clock.after(1000, update_time)
+
+ digital_clock = ui.label()
+ update_time()
\ No newline at end of file
diff --git a/ui.py b/ui.py
index 971d2cb..ea4b0a8 100644
--- a/ui.py
+++ b/ui.py
@@ -9,6 +9,7 @@ from time import strftime
from definitions import app_title, app_version
# Pinpad
+
def win_pinpad():
def update_time():
@@ -19,6 +20,8 @@ def win_pinpad():
root = tk.Tk()
root.title(app_title + " " + app_version)
+ root.eval('tk::PlaceWindow . center')
+
# Digital clock label configuration
digital_clock = tk.Label(root)
digital_clock.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
@@ -26,8 +29,18 @@ def win_pinpad():
update_time()
# Benutzernummer
+ def usernr_changed(UserNr):
+ nonlocal usernr
+ if len(str(usernr.get())) > 0:
+ buttons["OK"].configure(state="active")
+ else:
+ buttons["OK"].configure(state="disabled")
+
+
tk.Label(root, text="Benutzernummer:").grid(row=1, column=0)
- usernr = tk.Entry(root, width=10)
+ UserNr = tk.StringVar()
+ UserNr.trace("w", lambda name, index, mode, UserNr=UserNr: usernr_changed(UserNr))
+ usernr = tk.Entry(root, width=10, textvariable=UserNr)
usernr.grid(row=1,column=1)
# Pinpad
@@ -48,8 +61,8 @@ def win_pinpad():
buttons["OK"].configure(state="disabled")
# Buttons definieren
- button_width = 5
- button_height = 2
+ button_width = 7
+ button_height = 3
pinframe = tk.Frame(root)
pinframe.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
buttons = { }
@@ -69,7 +82,11 @@ def win_pinpad():
buttons["OK"].configure(state="disabled")
+ usernr.focus_set()
+
# Tkinter main loop
root.mainloop()
+def win_userselection():
+
diff --git a/users.py b/users.py
new file mode 100644
index 0000000..b733749
--- /dev/null
+++ b/users.py
@@ -0,0 +1,78 @@
+# Zeiterfassung
+
+# User bezogene Funktionen
+
+import os
+import datetime
+import time
+
+from definitions import userfolder, scriptpath, usersettingsfilename, photofilename, status_in, status_out
+
+# Benutzerklasse
+
+class user:
+ def __init__(self, name):
+ self.userfolder = scriptpath + "/" + userfolder + "/" + name
+ self.settingsfile = self.userfolder + "/" + usersettingsfilename
+ self.photofile = self.userfolder + "/" + photofilename
+
+ def get_stamp_file(self):
+ year = str(datetime.datetime.now().year)
+ month = str(datetime.datetime.now().month)
+ completepath = self.userfolder + "/" + year + "-" + month + ".txt"
+ return completepath
+
+ def timestamp(self):
+ filename = self.get_stamp_file()
+ timestamp = int(time.time())
+
+ try:
+ # Öffne die Datei im Anhang-Modus ('a')
+ with open(filename, 'a') as file:
+ # Schreibe den Timestamp in die Datei und füge einen Zeilenumbruch hinzu
+ file.write(f"{timestamp}\n")
+ file.close()
+ except FileNotFoundError:
+ # Fehlende Verzeichnisse anlegen
+ folder_path = os.path.dirname(filename)
+ os.makedirs(folder_path, exist_ok=True)
+ self.timestamp()
+
+ def stamp_status(self):
+ try:
+ # Öffne die Datei im Lese-Modus ('r')
+ with open(self.get_stamp_file(), 'r') as file:
+ # Zähle die Zeilen
+ lines = file.readlines()
+ file.close()
+ except FileNotFoundError:
+ print(f"Die Datei {filename} wurde nicht gefunden.")
+ if len(lines)== 0:
+ print(f"Keine Einträge")
+ elif len(lines) % 2 == 0:
+ return (status_out)
+ else:
+ return (status_in)
+
+ def last_2_timestmaps(self):
+
+ with open(self.get_stamp_file(), 'r') as file:
+ lines = file.readlines()
+ file.close()
+
+ if len(lines) > 2:
+ second_last_line = int(lines[-2])
+ last_line = int(lines[-1])
+ last_2_timestmaps = [second_last_line, last_line]
+ return last_2_timestmaps
+
+ elif len(lines) == 1:
+ return int(lines[0])
+ else:
+ return -1
+
+# Benutzer auflisten
+def list_users(user):
+ users = [d for d in os.listdir(userfolder) if os.path.isdir(os.path.join(userfolder, d))]
+ return users
+
diff --git a/users/test/2025-4.txt b/users/test/2025-4.txt
new file mode 100644
index 0000000..e69de29