diff --git a/timemanagement/templates/timemanagement/timemanagement_add.html b/timemanagement/templates/timemanagement/timemanagement_add.html index 41e2744..a8c093f 100644 --- a/timemanagement/templates/timemanagement/timemanagement_add.html +++ b/timemanagement/templates/timemanagement/timemanagement_add.html @@ -4,7 +4,7 @@ {% load counter_tag %} {% if request.user.profile.agency.module_timemanagement %}
-

Arbeitstag hinzufügen

+

Arbeitstag {% if team == 1 %} von {{user.get_full_name}} {% endif %} hinzufügen


Start- und Endzeitpunkt
diff --git a/timemanagement/templates/timemanagement/timemanagement_overview.html b/timemanagement/templates/timemanagement/timemanagement_overview.html deleted file mode 100644 index d5f2850..0000000 --- a/timemanagement/templates/timemanagement/timemanagement_overview.html +++ /dev/null @@ -1 +0,0 @@ -ÜBERSICHT \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_teamview.html b/timemanagement/templates/timemanagement/timemanagement_teamview.html index 715b5da..e877d7a 100644 --- a/timemanagement/templates/timemanagement/timemanagement_teamview.html +++ b/timemanagement/templates/timemanagement/timemanagement_teamview.html @@ -16,8 +16,8 @@ {% for item in usersofagency %} - {{item.first_name }} - {{ item.last_name }} + {{item.first_name }} + {{ item.last_name }} {{ item.email }} {% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%} @@ -34,21 +34,20 @@ {% if item.last_login != Nonte %}{{ item.last_login }}{% endif %} - {% if item != request.user %} - - {% endif %} + {% if item.usertime.usetime %} + {% else %} + Mitarbeiter macht keine Zeiterfassung. + {% endif %} {% endfor %}
- \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_teamview_single.html b/timemanagement/templates/timemanagement/timemanagement_teamview_single.html new file mode 100644 index 0000000..bc18e46 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_teamview_single.html @@ -0,0 +1,431 @@ +{% extends "users/base.html" %} +{% block content %} +{% load counter_tag %} +

Zeiterfassung von {{user.get_full_name}} bearbeiten +  Arbeitstag +

+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + {% for da in days_this_month %} + + {% getabscenceday user user da as abday %} + + + + + + {% if abday == False %} + + + + + + + {% else %} + + {% endif %} + + {% endfor %} + +
StartEndeArbeitszeitPausenGesamtzeitGleitzeit 
+ {{da|date:"l"}} + + {{da|date:"d.m.y"}} + + {% if abday != False %} + {{abday.reason}} + {% if abday.start == da%} + {% if abday.startday_info == "1" %} + (nur Vormittags) + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}, + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + + + + {% endif %} + {% endfor %} + + + + {% elif abday.startday_info == "2" %} + (nur Nachmittags) + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + + + + + {% endif %} + {% endfor %} + + {% endif %} + {% elif abday.end == da%} + {% if abday.endday_info == "1" %} + (nur Vormittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + + + + + + {% endif %} + {% endfor %} + + {% elif abday.endday_info == "2" %} + (nur Nachmittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + + + + + {% endif %} + {% endfor %} + + {% endif %} + {% endif %} + + {% else %} + {% if abday == False %} + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + {{workday.start|date:"H:i"}} + {% endif %} + {% endfor %} + {% endif %} + {% endif %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.end|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {{workday.end|date:"H:i"}} + {% endif %} + {% endfor %} + +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }} + {% endif %} + {% endfor %} + +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + {% counterWDUp %} + + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}) + {% endif %} + {% endfor %} + +
+ + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {% getsumworkday workday as sumwd %} + {{sumwd}} + {% endif %} + {% endfor %} + +
+ + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + {% endif %} + {% endfor %} + +
+ + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + + + + {% endif %} + {% endfor %} +
+
+ + +{% for workday in workdays %} + + +{% endfor %} + + + + +{% endblock content %} \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_update.html b/timemanagement/templates/timemanagement/timemanagement_update.html index b5413ff..8d83637 100644 --- a/timemanagement/templates/timemanagement/timemanagement_update.html +++ b/timemanagement/templates/timemanagement/timemanagement_update.html @@ -5,7 +5,7 @@ {% if request.user.profile.agency.module_timemanagement %}
-

Arbeitstag am {{workday.start|date:"d.m.Y"}} bearbeiten

+

Arbeitstag am {{workday.start|date:"d.m.Y"}} {% if team == 1 %} von {{user.get_full_name}} {% endif %} bearbeiten


Start- und Endzeitpunkt
@@ -16,7 +16,11 @@

Pausen + {% if team == 1 %} + + {% else %} + {% endif %}
@@ -41,7 +45,11 @@

+{% if team == 1 %} Abbrechen +{% else %} +Abbrechen +{% endif %}
diff --git a/timemanagement/urls.py b/timemanagement/urls.py index 0024adf..efa88ae 100644 --- a/timemanagement/urls.py +++ b/timemanagement/urls.py @@ -1,18 +1,24 @@ from django.urls import path from django.contrib.auth.decorators import login_required, permission_required -from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate, TimeUpdate, AddBreak, TimeAdd +from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate, TimeUpdate, AddBreak, TimeAdd, TimeManagementTeamSingle ''' Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! ''' urlpatterns = [ path('', TimeManagement, name='tm-management'), + path('tm/team/', TimeManagementTeamSingle, name='tm-team-single'), + path('tm/team///', TimeManagementTeamSingle, name='tm-team-single'), path('/', TimeManagement, name='tm-management'), path('update/', TimeUpdate, name='tm-update'), + path('update//', TimeUpdate, name='tm-update'), path('add/', TimeAdd, name='tm-add'), + path('add//', TimeAdd, name='tm-add'), path('update//addbreak/', AddBreak, name='add-break'), + path('update//addbreak/', AddBreak, name='add-break'), path('abs/', AbsenceManagmenet, name='tma-management'), path('abs//', AbsenceManagmenet, name='tma-management'), path('ajax/', TimeAjax, name='tm-ajax'), path('abs/update//', AbsenceUpdate, name='tma-update'), + ] diff --git a/timemanagement/views.py b/timemanagement/views.py index 6fcf9b9..7ff883c 100644 --- a/timemanagement/views.py +++ b/timemanagement/views.py @@ -285,6 +285,71 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False): return render(request, 'timemanagement/tm_ab_management.html', context) +@login_required +def TimeManagementTeamSingle(request, pk, activemonth=False, activeyear=False): + if(request.user.has_perm("users.usersmanager")): + # Setzt die Monatsausgabe auf Deutsch + locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') + user = User.objects.get(pk=pk) + # Hier wird der Monat und das Jahr für die Buttons gebaut + if(activemonth == False): + today = datetime.datetime.today() + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + activemonth = today.month + else: + today = datetime.datetime(activeyear, activemonth, 1) + active_month = activemonth + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + + prev_year = active_year + next_year = active_year + + next_month = today.month + 1 + if(next_month == 13): + next_month = 1 + next_year = int(next_year) + 1 + + prev_month = today.month - 1 + if(prev_month == 0): + prev_month = 12 + prev_year = int(prev_year) - 1 + + # Initialprüfung, ob Arbeitstage vorliegen + tempworkday = Workday.objects.filter(agency=request.user.profile.agency, user=user).order_by("start").exclude(end=None)[:1] + + user_has_workdays = False + if len(tempworkday) == 1: + user_has_workdays = True + + # Hier werden nur die Arbeitstage gefiltert, die auch aktuell zur Ansicht stehen sollen + context = { + "next_month" : next_month, + "breakmonthline" : date.today() - timedelta(days=30), + "prev_month" : prev_month, + "next_year" : next_year, + "prev_year" : prev_year, + "active_year" : int(active_year), + "active_month" : active_month, + "activemonth" : activemonth, + "active_link" : "timemanagement", + "days_this_month" : get_datetime_range(int(active_year), int(activemonth)), + "workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=user, start__month=activemonth, start__year=active_year).order_by("start").exclude(end=None), + "userhasworkdays" : user_has_workdays, + "user" : user + } + + return render(request, 'timemanagement/timemanagement_teamview_single.html', context) + + + + # Requestet User has no rights... + else: + messages.success(request, f'Das würfen Sie nicht!') + return redirect("timemanagement") + + @login_required def TimeManagement(request, activemonth=False, activeyear=False): # Setzt die Monatsausgabe auf Deutsch @@ -344,10 +409,15 @@ def TimeManagement(request, activemonth=False, activeyear=False): return render(request, 'timemanagement/timemanagement_management.html', context) @login_required -def TimeUpdate(request, pk): +def TimeUpdate(request, pk, team=0): + workday = Workday.objects.get(pk=pk) + user = workday.user + if(request.method == "POST"): - form = UpdateWorkdayForm(request.POST, instance=request.user) - workday = Workday.objects.get(pk=pk) + if(team == 0): + form = UpdateWorkdayForm(request.POST, instance=request.user) + else: + form = UpdateWorkdayForm(request.POST, instance=user) start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) @@ -358,74 +428,112 @@ def TimeUpdate(request, pk): workday.target = form["target"].value() workday.save() messages.success(request, f'Arbeitstag aktualisiert') - - return redirect('tm-management') + if(team == 1): + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) + else: + return redirect('tm-management') else: context = { "active_link" : "timemanagement", "workday" : Workday.objects.get(pk=pk), - "form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk)) + "form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk)), + "team" : team, + "user" : workday.user } return render(request, 'timemanagement/timemanagement_update.html', context) @login_required -def TimeAdd(request): - if(request.method == "POST"): +def TimeAdd(request, team=0, pk=0): + if(team == 0): + user = request.user form = AddWorkdayForm(request.POST, instance=request.user) + else: + user = User.objects.get(pk=pk) + form = AddWorkdayForm(request.POST, instance=user) + + if(request.method == "POST"): if form.is_valid(): #start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) #end = datetime.datetime(int(workday.end.year), int(workday.end.month), int(workday.end.day), int(((str(form["end"].value()).split(":"))[0])), int(((str(form["end"].value()).split(":"))[1]))) - workday = Workday(start=form.cleaned_data["start"], end=form.cleaned_data["end"], target=form.cleaned_data["target"], user=request.user, agency=request.user.profile.agency) + workday = Workday(start=form.cleaned_data["start"], end=form.cleaned_data["end"], target=form.cleaned_data["target"], user=user, agency=request.user.profile.agency) if workday.start.day != workday.end.day or workday.start.month != workday.end.month or workday.start.year != workday.end.year or workday.start > workday.end: messages.success(request, f'Der Arbeitstag darf nur an einem Tag stattfinden und das Ende muss nach dem Anfang liegen.') context = { "active_link" : "timemanagement", - "form" : AddWorkdayForm() + "form" : AddWorkdayForm(), + "team" : team, + "user" : user } return render(request, 'timemanagement/timemanagement_add.html', context) else: workday.save() messages.success(request, f'Arbeitstag hinzugefügt') - return redirect('tm-management') + + if (team == 1): + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) + else: + return redirect('tm-management') else: messages.success(request, f'Bitte valide Daten eingeben!') context = { "active_link" : "timemanagement", - "form" : AddWorkdayForm() + "form" : AddWorkdayForm(), + "team" : team, + "user" : user } return render(request, 'timemanagement/timemanagement_add.html', context) else: context = { "active_link" : "timemanagement", - "form" : AddWorkdayForm() - } + "form" : AddWorkdayForm(), + "team" : team, + "user" : user + } return render(request, 'timemanagement/timemanagement_add.html', context) @login_required -def AddBreak(request, pk): +def AddBreak(request, pk, team=0): + workday = Workday.objects.get(pk=pk) + user = workday.user if(request.method == "POST"): - workday = Workday.objects.get(pk=pk) - form = AddBreakForm(request.POST, instance=request.user) + if(team == 0): + form = AddBreakForm(request.POST, instance=request.user) + else: + form = AddBreakForm(request.POST, instance=user) start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) end = datetime.datetime(int(workday.end.year), int(workday.end.month), int(workday.end.day), int(((str(form["end"].value()).split(":"))[0])), int(((str(form["end"].value()).split(":"))[1]))) - newbreak = Breaks.objects.create(workday=workday, user=request.user, agency=request.user.profile.agency, start=start, end=end) + if(team == 0): + newbreak = Breaks.objects.create(workday=workday, user=request.user, agency=request.user.profile.agency, start=start, end=end) + else: + newbreak = Breaks.objects.create(workday=workday, user=user, agency=user.profile.agency, start=start, end=end) workday.breaks.add(newbreak) workday.save() messages.success(request, f'Pause hinzugefügt') - return redirect('tm-update', pk=pk) + + if(team == 0): + return redirect('tm-update', pk=pk) + else: + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) else: - context = { - "active_link" : "timemanagement", - "workday" : Workday.objects.get(pk=pk), - "form" : AddBreakForm(instance=request.user) - } + if(team == 0): + context = { + "active_link" : "timemanagement", + "workday" : Workday.objects.get(pk=pk), + "form" : AddBreakForm(instance=request.user) + } + else: + context = { + "active_link" : "timemanagement", + "workday" : Workday.objects.get(pk=pk), + "form" : AddBreakForm(instance=user) + } return render(request, 'timemanagement/timemanagement_break.html', context) @login_required @@ -511,7 +619,7 @@ def TimeAjax(request): # REMOVE WORKDAY elif request.GET["action"] == "remove_workday": wd = Workday.objects.get(pk=request.GET.get("workday")) - if(wd.user == request.user and wd.agency == request.user.profile.agency): + if(wd.agency == request.user.profile.agency): wd.delete() data = { "success" : True @@ -521,7 +629,7 @@ def TimeAjax(request): # REMOVE BREAK elif request.GET["action"] == "remove_break": breakwd = Breaks.objects.get(pk=request.GET.get("break")) - if(breakwd.user == request.user and breakwd.agency == request.user.profile.agency): + if(breakwd.agency == request.user.profile.agency): breakwd.delete() data = { "success" : True