Info welcher Mitarbeiter schon Abwesenheiten in diesem Zeitraum hat

This commit is contained in:
Holger Trampe 2020-05-30 00:41:17 +02:00
parent 5a633c5dd2
commit 763a3a5247
13 changed files with 169 additions and 43 deletions

View File

@ -19,7 +19,13 @@
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub</th>
<th scope="row">Genommener Urlaub</th>
{% for ab_info in user_years.all %}
<td>{{ab_info.days_inuse}}</td>
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub aus Vorjahr</th>
{% for ab_info in user_years.all %}
{% if forloop.counter0 > 0 %}
<td class="" id="rest_holiday_{{ab_info.pk}}">

View File

@ -15,7 +15,13 @@
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub Vorjahr</th>
<th scope="row">Genommener Urlaub</th>
{% for ab_info in user_years.all %}
<td>{{ab_info.days_inuse}}</td>
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub aus Vorjahr</th>
{% for ab_info in user_years.all %}
{% if forloop.counter0 > 0 %}
<td class="readytochange_holiday_rest" id="rest_holiday_{{ab_info.pk}}">{{ab_info.restdays}}</td>

View File

@ -213,7 +213,13 @@
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub</th>
<th scope="row">Genommener Urlaub</th>
{% for ab_info in user_years.all %}
<td>{{ab_info.days_inuse}}</td>
{% endfor %}
</tr>
<tr>
<th scope="row">Resturlaub aus Vorjahr</th>
{% for ab_info in user_years.all %}
{% if forloop.counter0 > 0 %}
<td class="readytochange_holiday_rest" id="rest_holiday_{{ab_info.pk}}">{{ab_info.restdays}}</td>

View File

@ -37,3 +37,7 @@ urlpatterns = [
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# ERROR HANDLERS
handler404 = 'users.views.handler404'
handler500 = 'users.views.handler500'

View File

@ -1,4 +1,5 @@
{% load crispy_forms_tags %}
{% load mathfilters %}
<h5>Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen oder ablehnen</h5>
<hr>
<h6>Informationen der Abwesenheit</h6>
@ -7,6 +8,23 @@ Bis: {{absence.end|date:"d.m Y"}}<br />
Grund: {{absence.reason.name}}<br />
Informationen: {{absence.info}}<br />
<hr>
<h5>Übersicht Urlaubstage wenn Anfrage genehmigt</h5>
<table class="table table-sm">
<tbody>
<tr>
<td>Gewünschte Tage</td>
<td>{{absence.holidays_normal|addition:absence.holidays_rest|addition:absence.holidays_normal_next|addition:absence.holidays_rest_next}}</td>
</tr>
<tr>
<td>Resturlaub {{absence.start.year}}</td>
<td>{{timeinfo_thisyear.restdays|addition:timeinfo_thisyear.days|sub:timeinfo_thisyear.days_inuse|addition:absence.holidays_rest}}</td>
</tr>
<tr>
<td>Resturlaub {{timeinfo_nextyear.year}}</td>
<td>{{timeinfo_nextyear.restdays|addition:timeinfo_nextyear.days|sub:timeinfo_nextyear.days_inuse|addition:absence.holidays_rest_next}}</td>
</tr>
</tbody>
</table>
<form method="POST">
<input type="hidden" name="form_type" value="confirmform">
{% csrf_token %}

View File

@ -369,7 +369,13 @@ function recalculateChoosenDays(){
success : function(data){
console.log(data);
if(data["other_absences"] != false){
$("#otherholidays").show();
$("#otherholidays_users").html(data["other_absences"]);
}
else{
$("#otherholidays").hide();
}
$("#startAbsenceProgress").modal("show");
@ -434,7 +440,15 @@ function recalculateChoosenDaysAfterInit(){
endday_info : $("#id_endday_info").val(),
},
success : function(data){
console.log(data);
if(data["other_absences"] != false){
$("#otherholidays").show();
$("#otherholidays_users").html(data["other_absences"]);
}
else{
$("#otherholidays").hide();
}
$("#restholidays").html(data["restholiday_thisyear"]);
$("#detail_rest").html(data["restholiday_thisyear"]);
$("#detail_resthol").html(data["restholiday_lastyear"]);

View File

@ -127,11 +127,6 @@
</table>
</div>
</div>
<!--
# TODO: Abwesenheiten - Meine Abwesenheiten, Übersicht über aktuelle Tage, Resturlaub in Jahren usw.
Bezug zu Urlaubsjahren mit Daten für Resturlaubsberechnung
-->
</div>
<div id="noholidays_container" style="display: none;">
<h6>Abwesenheitsgrund ohne Urlaubsanspruch</h6>
@ -168,6 +163,12 @@
</div>
</div>
</div>
<div id="otherholidays" style="display: none;">
<hr>
In diesem Zeitraum haben bereits folgende Mitarbeiter Abwesenheiten:
<br />
<div id="otherholidays_users"></div>
</div>
<!-- Fields for rest-logic -->
<div style="display: none;">
{{abscenceform.nextmonth}}

View File

@ -380,9 +380,18 @@ def TimeAjax(request):
# GET FORM FOR CONFIRM ABSENCE
elif request.GET["action"] == "getrenderedform":
absence = Absence.objects.get(pk=request.GET["abscenceid"])
timeinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year, user=absence.user))[0]
try:
timeinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year+1, user=absence.user))[0]
except:
timeinfo_nextyear = False
context = {
"confirmform" : ConfirmAbsenceForm(instance=request.user),
"absence" : Absence.objects.get(pk=request.GET["abscenceid"])
"absence" : absence,
"timeinfo_thisyear" : timeinfo_thisyear,
"timeinfo_nextyear" : timeinfo_nextyear
}
return render(request, "timemanagement/rendered_confirmform.html", context)
@ -507,6 +516,14 @@ def TimeAjax(request):
days_nextyear_rest = need_days_next + temprest
days_nextyear_normal = temprest * -1
other_absences = Absence.objects.filter(start__lte=start_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency) | Absence.objects.filter(start__lte=start_day_obj, end__lte=end_day_obj, agency=request.user.profile.agency) | Absence.objects.filter(start__gte=start_day_obj, end__lte=start_day_obj, agency=request.user.profile.agency) | Absence.objects.filter(start__lte=end_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency)
other_absences_string = False
if (len(other_absences) > 0):
other_absences_string = ""
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") + "<br />"
data = {
"restholiday_thisyear" : holiday_thisyear,
"restholiday_lastyear" : holiday_lastyear,
@ -516,6 +533,7 @@ def TimeAjax(request):
"need_days" : need_days,
"need_days_next" : need_days_next,
"need_days_this" : need_days_this,
"other_absences" : other_absences_string
}
# REQUEST USER NO RIGHTS
else:
@ -578,16 +596,16 @@ def calculatingHolidaysByAbsence(request, absence):
# Start und Ende gleich, nur ein Tag. Checken, ob Halber Tag
if(absence.start == absence.end):
if abscence.startday_info == "1" or abscence.startday_info == "2":
if absence.startday_info == "1" or absence.startday_info == "2":
finalholidayinabsence = 0.5
else:
finalholidayinabsence = 1
return finalholidayinabsence
else:
if abscence.startday_info == "1" or abscence.startday_info == "2":
if absence.startday_info == "1" or absence.startday_info == "2":
finalholidayinabsence -= 0.5
if abscence.endday_info == "1" or abscence.endday_info == "2":
if absence.endday_info == "1" or absence.endday_info == "2":
finalholidayinabsence -= 0.5
weekdays = [6,7]
@ -608,3 +626,4 @@ def daterange(date1, date2):
for n in range(int ((date2 - date1).days)+1):
yield date1 + timedelta(n)

View File

@ -500,13 +500,12 @@ def delete_absence(sender, instance, **kwargs):
multiple_info_needays = False
if(hasattr(newdata[3], "__len__")):
multiple_info_needays = True
# Mehrere Jahre oder nicht
if(instance.start.year != instance.end.year):
abinfo.days_inuse = abinfo.days_inuse - instance.holidays_normal
abinfo.save()
abinfo_nextyear.days_inuse = abinfo_nextyear.days_inuse - instance.holidays_normal_next
abinfo_nextyear.restdays = abinfo_nextyear.restdays + instance.holidays_rest_next
abinfo_nextyear.save()
else:
# Gleiches Jahr MIT Rest

View File

@ -0,0 +1,6 @@
{% extends "users/base.html" %}
{% block content %}
<div class="content-section col-md-5">
<h3>Hopala! Fehler 404 - Die aufgerufene Seite existiert nicht.</h3>
</div>
{% endblock content %}

View File

@ -0,0 +1,6 @@
{% extends "users/base.html" %}
{% block content %}
<div class="content-section col-md-5">
<h3>Hopala! Fehler 500 - Interner Serverfehler. Bitte kontaktieren Sie den Support!</h3>
</div>
{% endblock content %}

View File

@ -7,7 +7,7 @@ from django.views.generic import CreateView, ListView, UpdateView, DetailView, D
from django.contrib import messages
from django.contrib.auth.models import User, Permission
from django.db import models
from .models import Profile, Agency, UserTime
from .models import Profile, Agency, UserTime, UserYearAbsenceInfo
from django.core.mail import send_mail
from django.http import HttpResponseRedirect,HttpResponse, JsonResponse
from areas.models import Areas
@ -40,6 +40,7 @@ from asgiref.sync import async_to_sync
from channels_presence.models import Room
from channels_presence.models import Presence
import channels.layers
from datetime import date
def randomString(stringLength=10):
"""Generate a random string of fixed length """
@ -801,6 +802,25 @@ def impressum(request):
else:
return render(request, 'users/impressum_p.html')
'''
ERROR HANDLER VIEWS
'''
def handler404(request, exception):
context = {}
response = render(request, "users/errors/404.html", context=context)
response.status_code = 404
return response
def handler500(request):
context = {}
response = render(request, "users/errors/500.html", context=context)
response.status_code = 500
return response
'''
CRONJOB FUNCTION
@ -811,21 +831,18 @@ def cronactions(request, code):
if(code == settings.CRONAPIKEY):
# NEWS CHECKING
all_unnotifc_news = News.objects.filter(agnotify=False, go_online_on__lt=timezone.now())
allusers = User.objects.all()
for news in all_unnotifc_news:
targeturl = settings.BASE_URL + "news/news/" + str(news.pk) + "/single"
usersofagency = User.objects.filter(profile__agency=news.agency)
news.agnotify = True
news.save()
for user in usersofagency:
if(user.profile.news_mail):
for user in allusers:
if(user.profile.news_mail and news.agency == user.profile.agency):
notificationtext = "Neue Agenturnews: " + news.name
username = user.first_name + " " + user.last_name
msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext, 'linktarget' : targeturl})
GLOBALSENDMAILS = True
if(GLOBALSENDMAILS):
send_mail(
'Agentur-Benachrichtigung',
'Hallo ' + user.first_name + ' ' + user.last_name + '! ' + notificationtext,
@ -835,7 +852,7 @@ def cronactions(request, code):
fail_silently=True
)
if(user.profile.news_push):
if(user.profile.news_push and news.agency == user.profile.agency):
newnotification = UserNotification(touser=user, notificationtext="Neue Agenturnews: " + news.name, notificationtype="agencynews", elementid=news.pk)
newnotification.save()
@ -846,6 +863,29 @@ def cronactions(request, code):
'''
today = date.today()
for user in allusers:
usertimedata = UserTime.objects.get(user=user)
day_tocheck = usertimedata.loose_holidedate.split(".")[0]
month_tocheck = usertimedata.loose_holidedate.split(".")[1]
month = today.month
if month < 10:
month = "0" + str(month)
day = today.day
if day < 10:
day = "0" + str(day)
# Restetag erreicht, Reste ins nächste Jahr übertragen
if(str(day_tocheck) == str(day) and str(month_tocheck) == str(month)):
sourceyear = today.year
this_year = list(UserYearAbsenceInfo.objects.filter(year=sourceyear, user=user))[0]
next_year = list(UserYearAbsenceInfo.objects.filter(year=sourceyear+1, user=user))[0]
next_year.restdays = this_year.days - this_year.days_inuse
next_year.save()
data.update({"status" : "ok"})
elif(code == settings.MAILINFOKEY):
@ -876,3 +916,4 @@ def cronactions(request, code):
print("API CODE FAILED")
data.update({"status" : "failed"})
return JsonResponse(data)