166 lines
6.5 KiB
Python
166 lines
6.5 KiB
Python
# Zeiterfassung
|
|
import datetime
|
|
|
|
from nicegui import ui, app
|
|
|
|
from users import *
|
|
from definitions import *
|
|
from calendar import monthrange, month_name
|
|
|
|
import hashlib
|
|
import calendar
|
|
import locale
|
|
|
|
from web_ui import *
|
|
|
|
@ui.page('/')
|
|
def homepage():
|
|
ui.page_title(f'{app_title} {app_version}')
|
|
if login_is_valid():
|
|
|
|
try:
|
|
current_user = user(app.storage.user["active_user"])
|
|
except:
|
|
del(app.storage.user["active_user"])
|
|
ui.navigate.to('/')
|
|
pageheader(f"Willkommen, {current_user.fullname}")
|
|
|
|
today = datetime.datetime.now()
|
|
|
|
@ui.refreshable
|
|
def stamp_interface():
|
|
|
|
time_so_far = current_user.get_worked_time(today.year, today.month, today.day)[0]
|
|
|
|
def stamp_and_refresh():
|
|
current_user.timestamp()
|
|
stamp_interface.refresh()
|
|
|
|
with ui.grid(columns='20% auto 20%').classes('w-full justify-center'):
|
|
ui.space()
|
|
with ui.grid(columns='1fr 1fr'):
|
|
if current_user.stamp_status() == status_in:
|
|
bg_color = 'green'
|
|
else:
|
|
bg_color = 'red'
|
|
working_hours = ui.markdown(convert_seconds_to_hours(time_so_far)).classes(f'col-span-2 rounded-3xl text-center text-white text-bold text-2xl border-4 border-gray-600 bg-{bg_color}')
|
|
in_button = ui.button("Einstempeln", on_click=stamp_and_refresh).classes('bg-green')
|
|
out_button = ui.button("Ausstempeln", on_click=stamp_and_refresh).classes('bg-red')
|
|
|
|
def update_timer():
|
|
time_in_total = time_so_far + int((datetime.datetime.now().timestamp() - current_user.get_worked_time(today.year, today.month, today.day)[1]))
|
|
working_hours.set_content(convert_seconds_to_hours(time_in_total))
|
|
|
|
working_timer = ui.timer(1.0, update_timer)
|
|
working_timer.active = False
|
|
|
|
if current_user.stamp_status() == status_in:
|
|
in_button.set_enabled(False)
|
|
out_button.set_enabled(True)
|
|
working_timer.active = True
|
|
|
|
else:
|
|
in_button.set_enabled(True)
|
|
out_button.set_enabled(False)
|
|
working_timer.active = False
|
|
|
|
stamp_interface()
|
|
|
|
available_years = current_user.get_years()
|
|
|
|
|
|
available_months = [ ]
|
|
binder_month_button = ValueBinder()
|
|
binder_month_button.value = False
|
|
|
|
binder_available_years = ValueBinder()
|
|
|
|
binder_vacation = ValueBinder
|
|
binder_vacation.value = False
|
|
|
|
binder_absence = ValueBinder
|
|
binder_absence.value = False
|
|
|
|
def enable_month():
|
|
binder_month_button.value = True
|
|
|
|
def update_month():
|
|
month_dict = { }
|
|
for i in current_user.get_months(month_year_select.value):
|
|
month_dict[i] = month_name[i]
|
|
|
|
month_month_select.set_options(month_dict)
|
|
month_month_select.enable()
|
|
|
|
with ui.grid(columns='1fr auto 1fr').classes('w-full justify-center'):
|
|
|
|
ui.space()
|
|
with ui.expansion("Tagesnotiz", icon='o_description'):
|
|
with ui.grid(columns=2):
|
|
status_binder = ValueBinder()
|
|
|
|
def button_enabler():
|
|
if daynote.value == "":
|
|
status_binder.value = False
|
|
else:
|
|
status_binder.value = True
|
|
daynote = ui.textarea(on_change=button_enabler).classes('col-span-2')
|
|
try:
|
|
daynote.value = current_user.get_day_notes(today.year, today.month, today.day)["user"]
|
|
except:
|
|
daynote.value = ""
|
|
|
|
def save_note():
|
|
note_dict = { }
|
|
note_dict["user"] = daynote.value
|
|
current_user.write_notes(today.year, today.month, today.day, note_dict)
|
|
|
|
save_button = ui.button("Speichern", on_click=save_note)
|
|
#save_button.disable()
|
|
def del_text():
|
|
daynote.value = ""
|
|
delete_button = ui.button("Löschen", on_click=del_text).bind_enabled_from(status_binder, 'value')
|
|
#delete_button.disable()
|
|
status_binder.value = False
|
|
|
|
notes = current_user.get_day_notes(today.year, today.month, today.day)
|
|
try:
|
|
daynote.value = notes[current_user.username]
|
|
except:
|
|
pass
|
|
|
|
ui.separator()
|
|
|
|
with ui.grid(columns='1fr auto 1fr').classes('w-full justify-center'):
|
|
ui.space()
|
|
|
|
def activate_vacation():
|
|
binder_vacation.value = True
|
|
|
|
with ui.grid(columns='1fr 1fr'):
|
|
|
|
ui.markdown("**Monatsübersicht:**").classes('col-span-2')
|
|
|
|
month_year_select = ui.select(list(reversed(available_years)), label="Jahr", on_change=update_month).bind_value_to(binder_available_years, 'value')
|
|
month_month_select = ui.select(available_months, label="Monat", on_change=enable_month)
|
|
month_month_select.disable()
|
|
|
|
ui.space()
|
|
month_button = ui.button("Anzeigen", on_click=lambda: ui.navigate.to(f"/api/month/{current_user.username}/{month_year_select.value}-{month_month_select.value}", new_tab=True)).bind_enabled_from(binder_month_button, 'value')
|
|
ui.markdown("**Urlaubsanspruch**").classes('col-span-2')
|
|
vacation_select = ui.select(list(reversed(available_years)), on_change=activate_vacation)
|
|
vacation_button = ui.button("Anzeigen", on_click=lambda: ui.navigate.to(f"/api/vacation/{current_user.username}/{vacation_select.value}", new_tab=True)).bind_enabled_from(binder_vacation, 'value')
|
|
ui.markdown("**Fehlzeitenübersicht**").classes('col-span-2')
|
|
absences_select = ui.select(list(reversed(available_years)))
|
|
absences_button = ui.button("Anzeigen").bind_enabled_from(binder_absence, 'value')
|
|
ui.separator().classes('col-span-2')
|
|
|
|
def logout():
|
|
app.storage.user.pop("active_user", None)
|
|
ui.navigate.to("/")
|
|
|
|
ui.button("Logout", on_click=logout).classes('col-span-2')
|
|
ui.space()
|
|
|
|
else:
|
|
login_mask() |