diff --git a/.cred b/.cred index 1e9b8f8..ea260ec 100644 --- a/.cred +++ b/.cred @@ -1,2 +1,3 @@ https://holger.trampe:Zerogoogle123_@git.vhevents.de/ https://holger.trampe:Zerogoogle123_@git.vhevents.de/ +https://holger.trampe:Zerogoogle123_@git.vhevents.de/ diff --git a/dasettings/views.py b/dasettings/views.py index 8642d5f..fe966c9 100644 --- a/dasettings/views.py +++ b/dasettings/views.py @@ -942,7 +942,7 @@ def UserProfileUpdate(request, pk, newuser=0): } return render(request, 'dasettings/user_usprof.html', context) else: - messages.success(request, f'Fehlerhafte Eingabe!') + messages.success(request, f'Fehlerhafte Eingabe! Das Verfallsdatum muss im Format TAG.MONAT. sein und existieren!') context = { 'active_link' : 'dasettings', 'user_fullname' : user_fullname, diff --git a/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc b/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc index 4e1b812..3c4a07f 100644 Binary files a/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc and b/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc differ diff --git a/standards/templatetags/counter_tag.py b/standards/templatetags/counter_tag.py index c715559..6d37c75 100644 --- a/standards/templatetags/counter_tag.py +++ b/standards/templatetags/counter_tag.py @@ -1,6 +1,6 @@ from django import template from django.contrib.auth.models import Group, User -from users.models import AgencyGroup, Agency, AgencyNetwork, AgencyNetworkPreperation, UserTime +from users.models import AgencyGroup, Agency, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo from standards.models import Standards, StandardCommentRate, StandardComments from timemanagement.models import Workday, FreeDays, Absence from message.models import Message @@ -594,3 +594,47 @@ def loadaccounttime(user): return [final_info, status] +''' + + Gibt True zurück, wenn ein Mitarbeiter an diesem Tag laut Vertragsdaten NICHT arbeitet. + + Gibt False zurück, wenn er an diesem Tag mindestens 0.1 Stunden arbeitet + +''' +@register.simple_tag +def getthisdaynotworking(user, day): + stat = False + if(day.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + stat = True + elif(day.isoweekday() == 2): + if user.usertime.wd_tu == 0.0:# + stat = True + elif(day.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + stat = True + elif(day.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + stat = True + elif(day.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + stat = True + return stat + + +''' + +Gibt das verfügbare Urlaubskontingent eines Mitarbeiters zurück + +''' +@register.simple_tag +def kontingent(user): + kon = 0.0 + try: + yearinfo = list(UserYearAbsenceInfo.objects.filter(year=date.today().year, user=user))[0] + inuse = yearinfo.days_inuse + kon = yearinfo.days - inuse + except: + pass + + return kon diff --git a/timemanagement/templates/timemanagement/rendered_confirmform.html b/timemanagement/templates/timemanagement/rendered_confirmform.html index 27f9fe6..af48b51 100644 --- a/timemanagement/templates/timemanagement/rendered_confirmform.html +++ b/timemanagement/templates/timemanagement/rendered_confirmform.html @@ -1,5 +1,9 @@ {% load crispy_forms_tags %} {% load mathfilters %} +{% load counter_tag %} + +{% if user|usergperm:"absencemanager" %} +
Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen/ablehnen

Informationen der Abwesenheit
@@ -49,3 +53,10 @@ Informationen: {{absence.info}}
absencestring_confirm = 'Sicher, dass Sie die Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} vom {{absence.start|date:"d.m Y"}} bis {{absence.end|date:"d.m Y"}} annehmen wollen?' absencestring_noconfirm = 'Sicher, dass Sie die Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} vom {{absence.start|date:"d.m Y"}} bis {{absence.end|date:"d.m Y"}} ablehnen wollen?' + +{% else %} + +
Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen/ablehnen
+
+Diese Daten dürfen Sie nicht abrufen. +{% endif %} \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/rendered_table.html b/timemanagement/templates/timemanagement/rendered_table.html index 48d75ec..14e7f52 100644 --- a/timemanagement/templates/timemanagement/rendered_table.html +++ b/timemanagement/templates/timemanagement/rendered_table.html @@ -8,8 +8,9 @@ - {% for da in days_this_month %} - {{da|date:"d D"}} + {% for da in days_this_month %} + {% isfreeday user da as isfree %} + {{da|date:"d D"}} {% endfor %} @@ -20,20 +21,26 @@ {{us.get_full_name}} + {% if user|usergperm:"absencemanager" %} + {% kontingent us as userkontingent %} + {{userkontingent}} + {% endif %} - {% for da in days_this_month %} - + {% for da in days_this_month %} {% isfreeday user da as isfree %} {% isfreedayname user da as isfreename %} {% getabscenceday user us da as abday %} - {% startdatecheck us da as startdatecheck %} + {% startdatecheck us da as startdatecheck %} + {% getthisdaynotworking us da as thisdaynotworking %} {% if isfree %} {% elif startdatecheck == False %} - + + {% elif thisdaynotworking == True %} + {% elif da.weekday == 5 or da.weekday == 6 %} @@ -146,9 +153,13 @@ {% endif %} - {% else %} - + + {% elif today == da %} + + + {% else %} + {% endif %} {% endfor %} @@ -368,7 +379,7 @@ function recalculateChoosenDays(){ }, success : function(data){ - + console.log(data) if(data["other_absences"] != false){ $("#otherholidays").show(); $("#otherholidays_users").html(data["other_absences"]); @@ -377,6 +388,16 @@ function recalculateChoosenDays(){ $("#otherholidays").hide(); } + if(data["userown_absences"] != false){ + $("#ownholidays").show(); + $("#ownholidays_users").html(data["userown_absences"]); + } + else{ + $("#ownholidays").hide(); + } + + + $("#startAbsenceProgress").modal("show"); @@ -441,6 +462,8 @@ function recalculateChoosenDaysAfterInit(){ }, success : function(data){ + console.log(data); + if(data["other_absences"] != false){ $("#otherholidays").show(); $("#otherholidays_users").html(data["other_absences"]); @@ -448,6 +471,14 @@ function recalculateChoosenDaysAfterInit(){ else{ $("#otherholidays").hide(); } + + if(data["userown_absences"] != false){ + $("#ownholidays").show(); + $("#ownholidays_users").html(data["userown_absences"]); + } + else{ + $("#ownholidays").hide(); + } $("#restholidays").html(data["restholiday_thisyear"]); $("#detail_rest").html(data["restholiday_thisyear"]); @@ -482,7 +513,8 @@ function recalculateChoosenDaysAfterInit(){ behindcheck = true; } - if(behindcheck == false || data["restholiday_thisyear"] < 0 || data["restholiday_lastyear"] < 0 || data["restholiday_nextyear"] < 0 && data["startendcheck"] || data["restholiday_thisyear"] < 0 || data["restholiday_nextyear"] < 0 ){ + if(behindcheck == false || data["restholiday_thisyear"] < 0 || data["restholiday_lastyear"] < 0 || data["restholiday_nextyear"] < 0 && data["startendcheck"] || data["restholiday_thisyear"] < 0 || data["restholiday_nextyear"] < 0 || data["userown_absences"] != false) + { $("#start_absence_contract").prop("disabled", true); } else{ diff --git a/timemanagement/templates/timemanagement/timemanagement_management.html b/timemanagement/templates/timemanagement/timemanagement_management.html index 2cbb12a..3effae4 100644 --- a/timemanagement/templates/timemanagement/timemanagement_management.html +++ b/timemanagement/templates/timemanagement/timemanagement_management.html @@ -63,8 +63,7 @@ - - + {% if user.usertime.usetime_start == None %} @@ -328,7 +334,6 @@ $("#show_detailview").hover( ); */ - function confirmAbscenceFinal(){ $.ajax({ type: "GET", @@ -491,6 +496,11 @@ $('#absencetabs a').on('click', function (e) { {% endif %} diff --git a/timemanagement/views.py b/timemanagement/views.py index 5b56271..44bc949 100644 --- a/timemanagement/views.py +++ b/timemanagement/views.py @@ -276,6 +276,7 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False): "final_reasons" : final_reasons, "yearinfo" : yearinfo, "kontingent" : kontingent, + "today" : date.today(), "abscenceform" : AddAbsence(instance=request.user), "userown" : Absence.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("-start") } @@ -569,7 +570,6 @@ def TimeAjax(request): if(tempTime.startdate == None): missinguserdata.append(user) - context = { "active_link" : "abscence", "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).order_by("-last_name"), @@ -580,7 +580,8 @@ def TimeAjax(request): "nextmonth" : nextmonth, "prevmonth" : prevmonth, "nextyear" : nextyear, - "prevyear" : prevyear + "prevyear" : prevyear, + "today" : date.today(), } return render(request, "timemanagement/rendered_table.html", context) @@ -641,7 +642,7 @@ def TimeAjax(request): new_stat = request.GET["newconfstat"] info = request.GET["info"] - + # Eingeloggter Nutzer hat Rechte, Urlaube einzutragen if(absence.user.profile.agency == request.user.profile.agency and request.user.has_perm("users.absencemanager")): absence.confirm_status = new_stat absence.confirm_info = info @@ -657,6 +658,7 @@ def TimeAjax(request): "activemonth" : request.GET["activemonth"], "activeyear" : request.GET["activeyear"] } + # Berechnung starten, da Urlaub vorhanden ist elif request.GET["action"] == "getrestholidays": user = User.objects.get(pk=request.GET["userid"]) usertimedata = UserTime.objects.get(user=user) @@ -709,10 +711,10 @@ def TimeAjax(request): if(end_day_obj.year == start_day_obj.year): # Startt des Urlaubs NACH Verfallsdatum - nur aktuelles JAhr und die Zahl interessiert if(start_day_obj > holidayloose_date): - need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half))*(-1) + need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half, user))*(-1) holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days else: - need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half))*(-1) + need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half, user))*(-1) # Kein Resturlaub if(yeardata.restdays == 0.0): holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days @@ -732,17 +734,17 @@ def TimeAjax(request): holiday_lastyear = yeardata.restdays date_splitter = datetime.date(end_day_obj.year, 1, 1) - need_days_this = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False))*(-1) + need_days_this = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False), user)*(-1) - need_days_next = (calculateHolidays(request, date_splitter, end_day_obj, False, end_half))*(-1) + need_days_next = (calculateHolidays(request, date_splitter, end_day_obj, False, end_half, user))*(-1) - need_days = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False))*(-1) + (calculateHolidays(request, date_splitter, end_day_obj, False, end_half))*(-1) + need_days = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False, user))*(-1) + (calculateHolidays(request, date_splitter, end_day_obj, False, end_half))*(-1) holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days_this days_nextyear_normal = 0 days_nextyear_rest = 0 # Urlaub nächstes Jahr MIT und OHNE Rest if(holiday_nextyear_rest == 0.0): - holiday_nextyear = holiday_nextyear - (calculateHolidays(request, date_splitter, end_day_obj, False, end_half))*(-1) + holiday_nextyear = holiday_nextyear - (calculateHolidays(request, date_splitter, end_day_obj, False, end_half, user))*(-1) else: temprest = holiday_nextyear_rest - need_days_next # Rest reicht! @@ -766,6 +768,16 @@ def TimeAjax(request): for a in other_absences: other_absences_string += a.user.first_name + " " + a.user.last_name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y") + "
" + # Prüfen, ob der Nutzer selbst schon Abwesenheiten in diesem Zeitraum hat + + userown_absences = Absence.objects.filter(start__lte=start_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency, user=user) + print(userown_absences) + userown_absences_string = False + if (len(userown_absences) > 0): + userown_absences_string = "" + for a in userown_absences: + userown_absences_string += a.reason.name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y") + "
" + data = { "restholiday_thisyear" : holiday_thisyear, "restholiday_lastyear" : holiday_lastyear, @@ -775,7 +787,8 @@ def TimeAjax(request): "need_days" : need_days, "need_days_next" : need_days_next, "need_days_this" : need_days_this, - "other_absences" : other_absences_string + "other_absences" : other_absences_string, + "userown_absences" : userown_absences_string } # REQUEST USER NO RIGHTS else: @@ -798,7 +811,7 @@ Berücksichtigt sowohl Wochenende als auch in der Agentur hinterlegte Freitage/S ''' @login_required -def calculateHolidays(request, start, end, start_half, end_half): +def calculateHolidays(request, start, end, start_half, end_half, user): restdays = 0 allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency) if(end == start): @@ -825,7 +838,24 @@ def calculateHolidays(request, start, end, start_half, end_half): for freeday in allfreedays.all(): if(dt == freeday.day): freedaycounter += 1 - + + # Prüfung, ob der Mitarbeiter an diesem Tag überhaupt arbeitet. Wenn nicht, wird der Freedaycounter einfach erhöht + if(dt.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if user.usertime.wd_tu == 0.0:# + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + freedaycounter += 1 + return restdays - counter + freedaycounter @@ -856,10 +886,28 @@ def calculatingHolidaysByAbsence(request, absence): if dt.isoweekday() not in weekdays: finalholidayinabsence += 1 + # Prüfung, ob freie Tage vorhanden sind for freeday in allfreedays.all(): # FREEDAY FOUND if(dt == freeday.day): freedaycounter += 1 + # Prüfung, ob der Mitarbeiter an diesem Tag überhaupt arbeitet. Wenn nicht, wird der Freedaycounter einfach erhöht + stat = False + if(dt.isoweekday() == 1): + if absence.user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if absence.user.usertime.wd_tu == 0.0:# + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if absence.user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if absence.user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if absence.user.usertime.wd_fr == 0.0: + freedaycounter += 1 return finalholidayinabsence - freedaycounter diff --git a/users/signals.py b/users/signals.py index f427edc..b9976e1 100644 --- a/users/signals.py +++ b/users/signals.py @@ -417,8 +417,7 @@ def save_newabsence(sender, instance, **kwargs): abinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year+1)) if(len(abinfo_nextyear) > 0): is_nextyear = True - abinfo_nextyear = abinfo_nextyear[0] - + abinfo_nextyear = abinfo_nextyear[0] multiple_info_needays = False if(hasattr(newdata[3], "__len__")): @@ -463,7 +462,7 @@ def save_newabsence(sender, instance, **kwargs): abinfo_nextyear.restdays = abinfo_nextyear.restdays - newdata[3][3] abinfo_nextyear.save() - # Hier werd der REST als vorjahreswert und NORMAL als nächstes Jahr gespeichert + # Hier werden alle benötigten Tage von Vor- und Nächstem Jahr gespeichert instance.holidays_normal = newdata[3][0] instance.holidays_rest = 0 instance.holidays_normal_next = newdata[3][1] @@ -646,6 +645,21 @@ def calculateHolidays(user, start, end, start_half, end_half): if(dt == freeday.day): freedaycounter += 1 + if(dt.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if user.usertime.wd_tu == 0.0:# + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + freedaycounter += 1 return restdays - counter + freedaycounter