-
- Lade Kalenderdaten...
-
-
-
+
+
+
+
+
+
+
+
+ Lade Kalenderdaten...
+
+
+
+ {% block ab_userown %}
+ {% include "timemanagement/tm_ab_userown.html" %}
+ {% endblock %}
+
+
+{% if user|usergperm:"absencemanager" %}
+
+ {% block ab_toconfirm %}
+ {% include "timemanagement/tm_ab_toconfirm.html" %}
+ {% endblock %}
+
+
+
+ {% block ab_all %}
+ {% include "timemanagement/tm_ab_all.html" %}
+ {% endblock %}
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+
Abwesenheit für beantragen
+
+ {{abscenceform|crispy}}
+
+
+
+
+
+
+
{% else %}
Das Modul Abwesenheits- und Zeiterfassung wurde in ihrer Agentur deaktiviert.
diff --git a/timemanagement/templates/timemanagement/tm_ab_toconfirm.html b/timemanagement/templates/timemanagement/tm_ab_toconfirm.html
new file mode 100644
index 0000000..47f855f
--- /dev/null
+++ b/timemanagement/templates/timemanagement/tm_ab_toconfirm.html
@@ -0,0 +1,57 @@
+{% load counter_tag %}
+
+
+
+
+
+ Mitarbeiter
+ Start
+ Ende
+ Grund
+ Info
+ Status ändern
+
+
+
+ {% for abday in needtoconfirm %}
+
+ {{abday.user.first_name}} {{abday.user.last_name}}
+ {{abday.start|date:"d.M Y"}}
+ {{abday.end|date:"d.M Y"}}
+ {{abday.reason.name}}
+ {{abday.info}}
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/timemanagement/templates/timemanagement/tm_ab_userown.html b/timemanagement/templates/timemanagement/tm_ab_userown.html
new file mode 100644
index 0000000..aa18020
--- /dev/null
+++ b/timemanagement/templates/timemanagement/tm_ab_userown.html
@@ -0,0 +1,50 @@
+
+
+
+
+
+ Start
+ Ende
+ Grund
+ Status
+ Begründung
+
+
+
+ {% for abday in userown %}
+
+ {{abday.start|date:"d.M Y"}}
+ {{abday.end|date:"d.M Y"}}
+ {{abday.reason.name}}
+ {% if abday.confirm_status == 0 %} Genehmigt {% elif abday.confirm_status == 1 %} Beantragt {% else %} Abgelehnt {% endif %}
+ {{abday.confirm_info}}
+
+ {% endfor %}
+
+
+
+
+
\ No newline at end of file
diff --git a/timemanagement/views.py b/timemanagement/views.py
index a72a7d6..cf2bc1c 100644
--- a/timemanagement/views.py
+++ b/timemanagement/views.py
@@ -1,7 +1,7 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
-from .models import Workday, Breaks, FreeDays
+from .models import Workday, Breaks, FreeDays, AbsenceReason, Absence
from django.utils import timezone
import requests, csv, os
from django.templatetags.static import static
@@ -11,7 +11,11 @@ from django.contrib.auth.models import User
from calendar import monthrange
import datetime
import calendar
-from .forms import AddAbsence
+from .forms import AddAbsence, ConfirmAbsenceForm
+from django.contrib import messages
+from users.models import UserFullName
+
+
def loadingFreeDays(plz):
# Getting land
@@ -46,70 +50,124 @@ def get_datetime_range(year, month):
@login_required
def AbsenceManagmenet(request, activemonth=False, activeyear=False):
- prevmonth = ""
- nextmonth = ""
-
-
- #MONTH
- if(not activemonth or activemonth > 12 or activemonth < 1):
- activemonth = int(activemonth)
- #Active month
- activemonth=date.today().month
-
- if(activemonth == 1):
- prevmonth = 12
- else:
- prevmonth = activemonth-1
- if(activemonth == 12):
- nextmonth = 1
+ # NEW ABSENCE
+ if(request.method == "POST"):
+ '''
+
+ Nachdem eine neue Abwesenheit gespeichert wurde, geht es zur normalen Seite zurück, jedoch mit den Daten des
+ aktuell angezeigten Monate/Jahr
+
+ '''
+ if(request.POST.get("form_type") == "absenceform"):
+ formtocheck = AddAbsence(request.POST, instance=request.user)
+ if(formtocheck.is_valid()):
+
+ try:
+ workinguser = UserFullName.objects.get(pk=formtocheck.cleaned_data["userid"])
+
+ # DIFFERENT USER AGENCY
+ if(workinguser.profile.agency != request.user.profile.agency):
+ messages.success(request, f'Das dürfen Sie nicht!')
+ return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear'])
+ # ALL OK - START SAVING ABSENCE
+ else:
+ confirmstat = 0
+ if(request.user.has_perm("absencemanager") == False):
+ confirmstat = 1
+ messages.success(request, f'Abwesenheit beantragt')
+ # SEND NOTIFICATION
+ else:
+ messages.success(request, f'Abwesenheit eingetragen')
+
+ rep = None
+ if(formtocheck.cleaned_data["representator"] != None):
+ rep = User.objects.get(pk=formtocheck.cleaned_data["representator"].pk)
+
+ newab = Absence(agency=request.user.profile.agency, user=workinguser, start=formtocheck.cleaned_data["start"],end=formtocheck.cleaned_data["end"], representator=rep, confirm_status=confirmstat, info=formtocheck.cleaned_data["info"], reason=formtocheck.cleaned_data["reason"], start_ishalf=formtocheck.cleaned_data["start_ishalf"], end_ishalf=formtocheck.cleaned_data["end_ishalf"]).save()
+ # USER NOT FOUND
+ except:
+ messages.success(request, f'Fehler bei Benutzerzuweisung!')
+ return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear'])
+
+ return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear'])
+ else:
+ messages.success(request, f'Fehler beim eintragen der neuen Abwesenheit!')
+ return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear'])
else:
- nextmonth = activemonth + 1
+ return redirect('tma-management')
+ # NORMAL VIEW
else:
+ prevmonth = ""
+ nextmonth = ""
+ #MONTH
+ if(not activemonth or activemonth > 12 or activemonth < 1):
+ activemonth = int(activemonth)
+ #Active month
+ activemonth=date.today().month
+
+ if(activemonth == 1):
+ prevmonth = 12
+ else:
+ prevmonth = activemonth-1
+
+ if(activemonth == 12):
+ nextmonth = 1
+ else:
+ nextmonth = activemonth + 1
+ else:
+
+ if(activemonth == 1):
+ prevmonth = 12
+ else:
+ prevmonth = activemonth-1
+
+ if(activemonth == 12):
+ nextmonth = 1
+ else:
+ nextmonth = activemonth + 1
+
+ #YEAR
+ nextyear = date.today().year
+ prevyear = date.today().year
+
+ if(not activeyear):
+ activeyear = date.today().year
+ else:
+ if(nextmonth == 1):
+ nextyear = activeyear + 1
+ else:
+ nextyear = activeyear
+ if(prevmonth == 12):
+ prevyear = activeyear - 1
+ else:
+ prevyear = activeyear
- if(activemonth == 1):
- prevmonth = 12
- else:
- prevmonth = activemonth-1
+ context = {
+ "active_link" : "abscence",
+ "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).order_by("-last_name"),
+ "days_this_month" : get_datetime_range(activeyear,activemonth),
+ "nextmonth" : nextmonth,
+ "prevmonth" : prevmonth,
+ "nextyear" : nextyear,
+ "prevyear" : prevyear,
+ "activemonth" : activemonth,
+ "activeyear" : activeyear,
+ "abscenceform" : AddAbsence(instance=request.user),
+ "userown" : Absence.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("start")
+ }
- if(activemonth == 12):
- nextmonth = 1
- else:
- nextmonth = activemonth + 1
+ if(request.user.has_perm("users.absencemanager")):
+ context.update({
+ "needtoconfirm" : Absence.objects.filter(agency=request.user.profile.agency, confirm_status=1).order_by("-start"),
+ "allabsences" : Absence.objects.filter(agency=request.user.profile.agency).order_by("-start")
+ })
- #YEAR
- nextyear = date.today().year
- prevyear = date.today().year
-
- if(not activeyear):
- activeyear = date.today().year
- else:
- if(nextmonth == 1):
- nextyear = activeyear + 1
- else:
- nextyear = activeyear
- if(prevmonth == 12):
- prevyear = activeyear - 1
- else:
- prevyear = activeyear
-
- context = {
- "active_link" : "abscence",
- "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).order_by("-last_name"),
- "days_this_month" : get_datetime_range(activeyear,activemonth),
- "nextmonth" : nextmonth,
- "prevmonth" : prevmonth,
- "nextyear" : nextyear,
- "prevyear" : prevyear,
- "activemonth" : activemonth,
- "activeyear" : activeyear,
- "abscenceform" : AddAbsence()
- }
- return render(request, 'timemanagement/tm_ab_management.html', context)
+ return render(request, 'timemanagement/tm_ab_management.html', context)
@login_required
-def TimeManagement(request):
+def TimeManagement(request):
context = {
"active_link" : "timemanagement",
"workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("-start")
@@ -187,8 +245,8 @@ def TimeAjax(request):
}
else:
data = { "success" : False}
- # REMOVE WORKDAY
- elif request.GET["action"] == "testdjango":
+ # Get Rendered Table
+ elif request.GET["action"] == "getrenderedtable":
prevmonth = ""
nextmonth = ""
activemonth = int(request.GET["activemonth"])
@@ -248,9 +306,57 @@ def TimeAjax(request):
"nextyear" : nextyear,
"prevyear" : prevyear
}
-
-
return render(request, "timemanagement/rendered_table.html", context)
+
+ # Get Rendered Table
+ elif request.GET["action"] == "checkrequired":
+ reason = AbsenceReason.objects.get(pk=request.GET["rid"])
+ if(reason.agency == request.user.profile.agency):
+ data = {
+ "success" : True,
+ "isreq" : reason.need_rep
+ }
+ else:
+ data = {
+ "success" : False
+ }
+ # DELETE ABSENCE
+ elif request.GET["action"] == "remove_absence":
+ absence = Absence.objects.get(pk=request.GET["ab"])
+
+ if(request.user.has_perm("users.absencemanager") and absence.agency == request.user.profile.agency):
+ absence.delete()
+ data = {
+ "success" : True
+ }
+ # GET FORM FOR CONFIRM ABSENCE
+ elif request.GET["action"] == "getrenderedform":
+
+ context = {
+ "confirmform" : ConfirmAbsenceForm(instance=request.user),
+ "absence" : Absence.objects.get(pk=request.GET["abscenceid"])
+ }
+
+ return render(request, "timemanagement/rendered_confirmform.html", context)
+ elif request.GET["action"] == "confirmornotabscence":
+ absence = Absence.objects.get(pk=request.GET["absencetowork"])
+ new_stat = request.GET["newconfstat"]
+
+ info = request.GET["info"]
+
+ 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
+ absence.save()
+ messages.success(request, f'Abwesenheit gespeichert!')
+ else:
+ messages.success(request, f'Das dürfen Sie nicht!')
+
+ data = {
+ "success" : True,
+ "activemonth" : request.GET["activemonth"],
+ "activeyear" : request.GET["activeyear"]
+ }
else:
data = {
"success" : False
@@ -258,3 +364,4 @@ def TimeAjax(request):
return JsonResponse(data)
+
diff --git a/users/admin.py b/users/admin.py
index ed873be..6a960c1 100644
--- a/users/admin.py
+++ b/users/admin.py
@@ -6,7 +6,7 @@ from django.contrib.auth.models import Permission
from message.models import Message
from cloud.models import DataFile
from organizer.models import AGContacts
-from timemanagement.models import Workday, Breaks, AbsenceReason, FreeDays
+from timemanagement.models import Workday, Breaks, AbsenceReason, FreeDays, Absence
admin.site.register(StandardComments)
admin.site.register(StandardCommentRate)
@@ -25,4 +25,5 @@ admin.site.register(UserTime)
admin.site.register(Workday)
admin.site.register(Breaks)
admin.site.register(AbsenceReason)
+admin.site.register(Absence)
admin.site.register(FreeDays)
diff --git a/users/models.py b/users/models.py
index ebda601..c4ab975 100644
--- a/users/models.py
+++ b/users/models.py
@@ -252,7 +252,9 @@ class UserTime(models.Model):
wd_th = models.FloatField(default=8.0)
wd_fr = models.FloatField(default=8.0)
holiday = models.FloatField(default=24.0)
- loose_holidedate = models.DateField(default=datetime.date(datetime.datetime.now().year + 1, 4,30))
+ holiday_start = models.FloatField(default=0.0)
+ loose_holidedate = models.DateField(default=datetime.date(datetime.datetime.now().year + 1, 4,30))
+ startdate = models.DateTimeField(default=None, blank=True, null=True)
'''
diff --git a/users/static/users/img/registerbackground.jpg b/users/static/users/img/registerbackground.jpg
index 2aa0057..49841c9 100644
Binary files a/users/static/users/img/registerbackground.jpg and b/users/static/users/img/registerbackground.jpg differ