Zeiterfassung ausser Abwesenheiten fertig
This commit is contained in:
parent
642e1ee8bb
commit
ee77bb43c4
Binary file not shown.
|
|
@ -8,7 +8,7 @@ import os
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
import datetime
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
b = 0
|
b = 0
|
||||||
|
|
@ -273,7 +273,7 @@ def getactualworkingday(user):
|
||||||
returnstat = 0
|
returnstat = 0
|
||||||
|
|
||||||
if(len(wd) > 0):
|
if(len(wd) > 0):
|
||||||
returnstat = list(wd)[0].start
|
returnstat = list(wd)[0].start
|
||||||
return returnstat
|
return returnstat
|
||||||
|
|
||||||
# Return formatted Time-String
|
# Return formatted Time-String
|
||||||
|
|
@ -350,7 +350,7 @@ def getdailybreaktime(user):
|
||||||
@register.simple_tag
|
@register.simple_tag
|
||||||
def getdailybreaktimetoday(user):
|
def getdailybreaktimetoday(user):
|
||||||
today = date.today()
|
today = date.today()
|
||||||
wd = list(Workday.objects.filter(user=user, agency=user.profile.agency, start__day=today.day).order_by("start"))[0]
|
wd = list(Workday.objects.filter(user=user, agency=user.profile.agency).order_by("start").exclude(end=None))[0]
|
||||||
breaksum = 0
|
breaksum = 0
|
||||||
for b in wd.breaks.all():
|
for b in wd.breaks.all():
|
||||||
if(b.end != None):
|
if(b.end != None):
|
||||||
|
|
@ -372,7 +372,16 @@ def getsumworkday(workday):
|
||||||
mon, sec = divmod(finalsum, 60)
|
mon, sec = divmod(finalsum, 60)
|
||||||
hr, mon = divmod(mon, 60)
|
hr, mon = divmod(mon, 60)
|
||||||
#return ("%d Stunden und %02d:%02d" % (hr, mon, sec))
|
#return ("%d Stunden und %02d:%02d" % (hr, mon, sec))
|
||||||
return ("%d Stunden, %02d Minuten" % (hr, mon))
|
return ("%d:%02d" % (hr, mon))
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def getsumworkdayexcludebreak(workday):
|
||||||
|
finalsum = ((workday.end - workday.start).seconds)
|
||||||
|
|
||||||
|
mon, sec = divmod(finalsum, 60)
|
||||||
|
hr, mon = divmod(mon, 60)
|
||||||
|
#return ("%d Stunden und %02d:%02d" % (hr, mon, sec))
|
||||||
|
return ("%d:%02d" % (hr, mon))
|
||||||
|
|
||||||
@register.simple_tag
|
@register.simple_tag
|
||||||
def getsumbreak(workday):
|
def getsumbreak(workday):
|
||||||
|
|
@ -507,3 +516,81 @@ def startdatecheck(usertocheck, day):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# Gibt Minus/Null/Plus Gleitzeit für einen Arbeitstag
|
||||||
|
@register.simple_tag
|
||||||
|
def gettimeoveralldiff(workday, user):
|
||||||
|
sum_break = 0
|
||||||
|
|
||||||
|
if(len(workday.breaks.all()) > 0):
|
||||||
|
|
||||||
|
for ele in workday.breaks.all():
|
||||||
|
sum_break += (ele.end - ele.start).seconds
|
||||||
|
|
||||||
|
finalsum = ((workday.end - workday.start).seconds - sum_break)
|
||||||
|
hastowork = datetime.timedelta(hours=workday.target)
|
||||||
|
|
||||||
|
# Finale Summe Arbeitszeit inkl. Pausen und Arbeitszeit an diesem Tag
|
||||||
|
final_info = (int(finalsum) - int(hastowork.total_seconds()))/60
|
||||||
|
|
||||||
|
status = 0
|
||||||
|
# NEGATIVE GLEITZEIT
|
||||||
|
if(final_info < 0):
|
||||||
|
final_info = final_info * -1
|
||||||
|
status = 2
|
||||||
|
# Positive Gleitzeit
|
||||||
|
elif (final_info == 0):
|
||||||
|
status = 1
|
||||||
|
else:
|
||||||
|
status = 0
|
||||||
|
|
||||||
|
final_timeinfo = str(datetime.timedelta(minutes=final_info))
|
||||||
|
final_info_data = final_timeinfo.split(":")
|
||||||
|
final_info = str(final_info_data[0]) + ":" + str(final_info_data[1])
|
||||||
|
|
||||||
|
return [final_info, status]
|
||||||
|
|
||||||
|
|
||||||
|
# Ladet das aktuelle Gleitzeitkonto
|
||||||
|
@register.simple_tag
|
||||||
|
def loadaccounttime(user):
|
||||||
|
status = 0
|
||||||
|
workdays = Workday.objects.filter(user=user).exclude(end=None)
|
||||||
|
|
||||||
|
finalaccounttimesum = datetime.timedelta(minutes=0)
|
||||||
|
|
||||||
|
|
||||||
|
for workday in workdays:
|
||||||
|
# Zeit, die der Mitarbeiter gearbeitet haben MUSS
|
||||||
|
|
||||||
|
sum_break = 0
|
||||||
|
|
||||||
|
if(len(workday.breaks.all()) > 0):
|
||||||
|
|
||||||
|
for ele in workday.breaks.all():
|
||||||
|
sum_break += (ele.end - ele.start).seconds
|
||||||
|
|
||||||
|
finalsum = ((workday.end - workday.start).seconds - sum_break)
|
||||||
|
hastowork = datetime.timedelta(hours=workday.target)
|
||||||
|
final_info = (int(finalsum) - int(hastowork.total_seconds()))/60
|
||||||
|
|
||||||
|
if(final_info >= 0.0):
|
||||||
|
finalaccounttimesum += datetime.timedelta(minutes=final_info)
|
||||||
|
else:
|
||||||
|
final_info = final_info * -1
|
||||||
|
finalaccounttimesum -= datetime.timedelta(minutes=final_info)
|
||||||
|
|
||||||
|
|
||||||
|
# Gesamtgleitzeit einmal schick darstellen mit rot und grün
|
||||||
|
# Wenn GLeitzeit NEGATIV ist
|
||||||
|
if(finalaccounttimesum.total_seconds() < 0):
|
||||||
|
status = 1
|
||||||
|
final_info_data = str(datetime.timedelta(seconds=finalaccounttimesum.total_seconds()*(-1))).split(":")
|
||||||
|
else:
|
||||||
|
status = 0
|
||||||
|
final_info_data = str(datetime.timedelta(seconds=finalaccounttimesum.total_seconds())).split(":")
|
||||||
|
|
||||||
|
final_info = str(final_info_data[0]) + ":" + str(final_info_data[1])
|
||||||
|
|
||||||
|
return [final_info, status]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from bootstrap_datepicker_plus import DatePickerInput
|
from bootstrap_datepicker_plus import DatePickerInput
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.forms import ModelForm
|
from django.forms import ModelForm
|
||||||
from .models import Absence, AbsenceReason, FreeDays
|
from .models import Absence, AbsenceReason, FreeDays, Workday, Breaks
|
||||||
from users.models import UserFullName
|
from users.models import UserFullName
|
||||||
from django.forms import HiddenInput
|
from django.forms import HiddenInput
|
||||||
|
|
||||||
|
|
@ -136,4 +136,50 @@ class AddFreeDayForm(forms.ModelForm):
|
||||||
def __init__(self, *arg, **kwargs):
|
def __init__(self, *arg, **kwargs):
|
||||||
super(AddFreeDayForm, self).__init__(*arg, **kwargs)
|
super(AddFreeDayForm, self).__init__(*arg, **kwargs)
|
||||||
self.fields['name'].required = True
|
self.fields['name'].required = True
|
||||||
self.fields['day'].required = True
|
self.fields['day'].required = True
|
||||||
|
|
||||||
|
|
||||||
|
# UPDATE WORK FORM
|
||||||
|
class UpdateWorkdayForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Workday
|
||||||
|
labels = {
|
||||||
|
"start" : "Start",
|
||||||
|
"end" : "Ende",
|
||||||
|
"target" : "Zielarbeitszeit"
|
||||||
|
}
|
||||||
|
|
||||||
|
fields = [
|
||||||
|
"start", "end", "target"
|
||||||
|
]
|
||||||
|
widgets = {
|
||||||
|
'start': DatePickerInput(options={"format":'HH:mm', "locale":'de'}),
|
||||||
|
'end': DatePickerInput(options={"format":'HH:mm', "locale":'de'}),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *arg, **kwargs):
|
||||||
|
super(UpdateWorkdayForm, self).__init__(*arg, **kwargs)
|
||||||
|
self.fields['start'].required = True
|
||||||
|
self.fields['end'].required = True
|
||||||
|
|
||||||
|
# ADD BREAK FORM
|
||||||
|
class AddBreakForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Breaks
|
||||||
|
labels = {
|
||||||
|
"start" : "Start",
|
||||||
|
"end" : "Ende"
|
||||||
|
}
|
||||||
|
|
||||||
|
fields = [
|
||||||
|
"start", "end"
|
||||||
|
]
|
||||||
|
widgets = {
|
||||||
|
'start': DatePickerInput(options={"format":'HH:mm', "locale":'de'}),
|
||||||
|
'end': DatePickerInput(options={"format":'HH:mm', "locale":'de'}),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *arg, **kwargs):
|
||||||
|
super(AddBreakForm, self).__init__(*arg, **kwargs)
|
||||||
|
self.fields['start'].required = True
|
||||||
|
self.fields['end'].required = True
|
||||||
|
|
@ -11,6 +11,7 @@ class Workday(models.Model):
|
||||||
breaks = models.ManyToManyField("Breaks", blank=True, related_name='breaks_at_day')
|
breaks = models.ManyToManyField("Breaks", blank=True, related_name='breaks_at_day')
|
||||||
start = models.DateTimeField(default=None, null=True, blank=True)
|
start = models.DateTimeField(default=None, null=True, blank=True)
|
||||||
end = models.DateTimeField(default=None, null=True, blank=True)
|
end = models.DateTimeField(default=None, null=True, blank=True)
|
||||||
|
target = models.FloatField(default=8.0)
|
||||||
|
|
||||||
class Breaks(models.Model):
|
class Breaks(models.Model):
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,13 @@
|
||||||
<button onclick="javascript:startDay()" type="button" id="" class="btn btn-success">Arbeitstag starten</button>
|
<button onclick="javascript:startDay()" type="button" id="" class="btn btn-success">Arbeitstag starten</button>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
Gleitzeitkonto: +00:13 Stunden
|
{% loadaccounttime user as actualaccounttime %}
|
||||||
|
Gleitzeitkonto:
|
||||||
|
{% if actualaccounttime.1 == 0 %}
|
||||||
|
<b><span style="color: green">+{{actualaccounttime.0}} Stunden</span></b>
|
||||||
|
{% else %}
|
||||||
|
<b><span style="color: red">-{{actualaccounttime.0}} Stunden</span></b>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
|
@ -109,25 +115,33 @@ Gleitzeitkonto: +00:13 Stunden
|
||||||
{% else %}
|
{% else %}
|
||||||
var isbreak = false;
|
var isbreak = false;
|
||||||
var startbreaktime_view = 0;
|
var startbreaktime_view = 0;
|
||||||
var starttime_view = Date.parse("{{starttime}}");
|
var starttime_view = parseDate("{{starttime}}");
|
||||||
|
|
||||||
$("#start_workday").hide();
|
$("#start_workday").hide();
|
||||||
$("#activeDay").show();
|
$("#activeDay").show();
|
||||||
$("#starttime").html("{{formattetstarttime}}");
|
$("#starttime").html("{{formattetstarttime}}");
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
function realTimeClock(start=false)
|
function parseDate(input) {
|
||||||
|
input_all = input.split(" ");
|
||||||
|
day = input_all[0].split(".")[0]
|
||||||
|
var today = new Date();
|
||||||
|
newdate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), parseInt(input_all[3].split(":")[0]), parseInt(input_all[3].split(":")[1]));
|
||||||
|
|
||||||
|
return newdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = false;
|
||||||
|
|
||||||
|
function realTimeClock()
|
||||||
{
|
{
|
||||||
if(start != false){
|
if(start != false){
|
||||||
startDate = Date.parse(start);
|
startDate = Date.parse(start);
|
||||||
starttime_view = startDate;
|
starttime_view = startDate;
|
||||||
realTimeClock();
|
start = false;
|
||||||
|
realTimeClock();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
now = new Date();
|
now = new Date();
|
||||||
|
|
@ -217,8 +231,8 @@ Gleitzeitkonto: +00:13 Stunden
|
||||||
$("#endtime").html("00:00:00");
|
$("#endtime").html("00:00:00");
|
||||||
$("#breaksum").html("00:00:00");
|
$("#breaksum").html("00:00:00");
|
||||||
}
|
}
|
||||||
|
start = data["wd_starttime_complete"];
|
||||||
realTimeClock(data["wd_starttime_complete"]);
|
realTimeClock();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -252,10 +266,12 @@ Gleitzeitkonto: +00:13 Stunden
|
||||||
$("#breaksum").html(convertMS(data["actualbreaktime"]));
|
$("#breaksum").html(convertMS(data["actualbreaktime"]));
|
||||||
starttime_view = false;
|
starttime_view = false;
|
||||||
isbreak = false;
|
isbreak = false;
|
||||||
|
start = false;
|
||||||
breaktime = 0;
|
breaktime = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
realTimeClock(data["wd_starttime_complete"]);
|
//start = data["wd_starttime_complete"]
|
||||||
|
realTimeClock();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -459,7 +459,7 @@ function recalculateChoosenDaysAfterInit(){
|
||||||
$("#detail_tocontract").html(data["need_days"]);
|
$("#detail_tocontract").html(data["need_days"]);
|
||||||
$("#detail_tocontract_overall").html(data["need_days"]);
|
$("#detail_tocontract_overall").html(data["need_days"]);
|
||||||
$("#detail_next_rest").html(data["restholiday_nextyear_rest"]);
|
$("#detail_next_rest").html(data["restholiday_nextyear_rest"]);
|
||||||
|
|
||||||
if(data["two_years"] == true){
|
if(data["two_years"] == true){
|
||||||
$("#detail_tocontract").html(data["need_days_this"]);
|
$("#detail_tocontract").html(data["need_days_this"]);
|
||||||
$("#two_years").show();
|
$("#two_years").show();
|
||||||
|
|
@ -482,7 +482,7 @@ function recalculateChoosenDaysAfterInit(){
|
||||||
behindcheck = true;
|
behindcheck = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(behindcheck == false || data["restholiday_thisyear"] < 0 || data["restholiday_lastyear"] < 0 || data["restholiday_nextyear"] < 0 && data["startendcheck"]){
|
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 ){
|
||||||
$("#start_absence_contract").prop("disabled", true);
|
$("#start_absence_contract").prop("disabled", true);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% load counter_tag %}
|
||||||
|
{% if request.user.profile.agency.module_timemanagement %}
|
||||||
|
<div class="content-section col-7">
|
||||||
|
|
||||||
|
<h3>Zum Arbeitstag am {{workday.start|date:"d.m.Y"}} Pause hinzufügen</h3>
|
||||||
|
<hr>
|
||||||
|
<div class="col-6" style="margin-left: -10px;">
|
||||||
|
<form method="POST" class="">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{form.media}}
|
||||||
|
{{form}}
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<a class="btn" href="{% url 'tm-update' workday.pk %} ">Abbrechen</a>
|
||||||
|
<button type="submit" class="btn btn-primary" style="float: right" id="addbreakbutton" disabled="true">Pause hinzufügen</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#id_end").blur(function(){
|
||||||
|
checkBreaks();
|
||||||
|
})
|
||||||
|
|
||||||
|
$("#id_start").blur(function(){
|
||||||
|
checkBreaks();
|
||||||
|
})
|
||||||
|
|
||||||
|
function checkBreaks(){
|
||||||
|
$('.ui-datepicker-calendar').hide();
|
||||||
|
$('.ui-datepicker-header').hide();
|
||||||
|
|
||||||
|
new_start = $("#id_start").datepicker().val();
|
||||||
|
new_end = $("#id_end").datepicker().val();
|
||||||
|
if(new_start >= new_end){
|
||||||
|
$("#addbreakbutton").prop("disabled", true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$("#addbreakbutton").prop("disabled", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -14,9 +14,8 @@
|
||||||
<th scope="col">Ende</th>
|
<th scope="col">Ende</th>
|
||||||
<th scope="col">Arbeitszeit</th>
|
<th scope="col">Arbeitszeit</th>
|
||||||
<th scope="col">Pausen</th>
|
<th scope="col">Pausen</th>
|
||||||
<th scope="col">Gesamtzeit</th>
|
<th scope="col">Gesamtzeit</th>
|
||||||
<th scope="col">Abwesenheit</th>
|
<th scope="col">Gleitzeit</th>
|
||||||
<th scope="col">Gleitzeit in h</th>
|
|
||||||
<th scope="col"> </th>
|
<th scope="col"> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
@ -27,31 +26,36 @@
|
||||||
{{forloop.counter}}
|
{{forloop.counter}}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{workday.start}}
|
{{workday.start|date:"d.m.y H:i"}}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{workday.end}}
|
{{workday.end|date:"d.m.y H:i"}}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ workday.end|timeuntil:workday.start }}
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% getsumbreak workday as sumbreakofday %}
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
{{sumbreakofday}} min. ({{workday.breaks.all|length}})
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}})
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{% getsumworkday workday as sumwd %}
|
{% getsumworkday workday as sumwd %}
|
||||||
{{sumwd}}
|
{{sumwd}}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
DROPDOWN
|
{% gettimeoveralldiff workday user as erg%}
|
||||||
|
{% if erg.1 == 0 %}
|
||||||
|
<span style="color: green">+{{erg.0}}</span>
|
||||||
|
{% elif erg.1 == 1 %}
|
||||||
|
<span>{{erg.0}}</span>
|
||||||
|
{% else %}
|
||||||
|
<span style="color: red">-{{erg.0}}</span>
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
</td>
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk %}'"><small><i class="fas fa-pen"></i></small></button>
|
||||||
<td>
|
<button class="btn btn-secondary btn-sm " onclick="javascript:$('#confirm-delete_{{workday.pk}}').modal('toggle')"><small><i class="fas fa-trash"></i></small></button>
|
||||||
<button class="btn btn-secondary btn-sm ml-2" onclick="javascript:$('#confirm-delete_{{workday.pk}}').modal('toggle')"><small><i class="fas fa-trash"></i></small></button>
|
|
||||||
<button class="btn btn-secondary btn-sm " href=""><small><i class="fas fa-pen"></i></small></button>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -60,6 +64,82 @@
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% if user.usertime.usetime_start == None %}
|
||||||
|
<div class="modal fade" tabindex="-1" role="dialog" data-backdrop="static" id="missingdatainfo">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Fehlende Informationen</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Achtung! Es wurde kein Datum gefunden, ab wann die Zeiterfassung beginnen soll. Bitte tragen Sie dies in Ihrem Mitarbeiterkonto unter Einstellungen, Mitarbeiter, Ihre Vertragsdaten nach.
|
||||||
|
<br />
|
||||||
|
<small>Dies können nur Mitarbeiter eintragen, die das Recht haben, Mitarbeiter zu verwalten.</small>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary" data-dismiss="modal">Schließen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#missingdatainfo").modal("toggle");
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#missingdatainfo').on('hidden.bs.modal', function (e) {
|
||||||
|
location.href = "{% url 'dasettings' %}";
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% elif workdays|length == 0 %}
|
||||||
|
<div class="modal fade" tabindex="-1" role="dialog" data-backdrop="static" id="initialload">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Arbeitstage auffüllen</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Es wurden keine Arbeitstage bis zum Beginn der Zeiterfassung am {{user.usertime.usetime_start|date:"d.m.Y"}} gefunden. Sollen diese Tage mit der Regelarbeitszeit aufgefüllt werden, welche bei den Vertragsdaten hinterlegt wurde?
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="javascript:loadInitiDays()">Ja</button>
|
||||||
|
<button type="button" class="btn btn" data-dismiss="modal">Nein</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#initialload").modal("toggle");
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadInitiDays(){
|
||||||
|
$.ajax(
|
||||||
|
{
|
||||||
|
type: "GET",
|
||||||
|
url: "{% url 'tm-ajax' %}",
|
||||||
|
data:{
|
||||||
|
action : "initial_load",
|
||||||
|
},
|
||||||
|
success: function( data )
|
||||||
|
{
|
||||||
|
location.href = location.href;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% for workday in workdays %}
|
{% for workday in workdays %}
|
||||||
<div class="modal fade" id="confirm-delete_{{workday.pk}}" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
|
<div class="modal fade" id="confirm-delete_{{workday.pk}}" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,114 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% load counter_tag %}
|
||||||
|
{% if request.user.profile.agency.module_timemanagement %}
|
||||||
|
<div class="content-section col-5">
|
||||||
|
|
||||||
|
<h3>Arbeitstag am {{workday.start|date:"d.m.Y"}} bearbeiten</h3>
|
||||||
|
<hr>
|
||||||
|
<h5>Start- und Endzeitpunkt</h5>
|
||||||
|
<div class="col-6" style="margin-left: -10px;">
|
||||||
|
<form method="POST" class="">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{form.media}}
|
||||||
|
{{form|crispy}}
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<h5>Pausen
|
||||||
|
<button class="btn btn-primary btn-sm" style="float: right" onclick="window.location.href='{% url 'add-break' workday.pk %}'"><i class="fas fa-plus"></i></button>
|
||||||
|
</h5>
|
||||||
|
<div col="col-10">
|
||||||
|
<table class="table table-hover" >
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">Start</th>
|
||||||
|
<th scope="col">Ende</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for break in workday.breaks.all %}
|
||||||
|
<tr id="wd_break_{{break.pk}}">
|
||||||
|
<td>{{forloop.counter}}</td>
|
||||||
|
<td>{{break.start|date:"H:i"}}</td>
|
||||||
|
<td>{{break.end|date:"H:i"}}</td>
|
||||||
|
<td><button class="btn btn-secondary btn-sm " style="float: right" onclick="javascript:$('#confirm-delete_{{break.pk}}').modal('toggle')"><small><i class="fas fa-trash"></i></small></button></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a class="btn" href="{% url 'tm-management' %} ">Abbrechen</a>
|
||||||
|
<button type="submit" class="btn btn-primary" style="float: right" id="addbreakbutton">Arbeitstag aktualisieren</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{% for break in workday.breaks.all %}
|
||||||
|
<div class="modal fade" id="confirm-delete_{{break.pk}}" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Pause löschen</h5>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Möchten Sie wirklich die Pause von {{break.start|date:"H:i"}} bis {{break.end|date:"H:i"}} löschen?
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-primary" id="dodel_{{break.pk}}" >Löschen</button>
|
||||||
|
<button type="button" class="btn" data-dismiss="modal">Abbrechen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#dodel_{{break.pk}}").click(function(){
|
||||||
|
$.ajax(
|
||||||
|
{
|
||||||
|
type: "GET",
|
||||||
|
url: "{% url 'tm-ajax' %}",
|
||||||
|
data:{
|
||||||
|
action : "remove_break",
|
||||||
|
break: {{break.pk}},
|
||||||
|
},
|
||||||
|
success: function( data )
|
||||||
|
{
|
||||||
|
$("#wd_break_{{break.pk}}").remove();
|
||||||
|
$("#confirm-delete_{{break.pk}}").modal("toggle");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#id_end").blur(function(){
|
||||||
|
checkBreaks();
|
||||||
|
})
|
||||||
|
|
||||||
|
$("#id_start").blur(function(){
|
||||||
|
checkBreaks();
|
||||||
|
})
|
||||||
|
|
||||||
|
function checkBreaks(){
|
||||||
|
|
||||||
|
$('.ui-datepicker-calendar').hide();
|
||||||
|
$('.ui-datepicker-header').hide();
|
||||||
|
|
||||||
|
new_start = $("#id_start").datepicker().val();
|
||||||
|
new_end = $("#id_end").datepicker().val();
|
||||||
|
if(new_start >= new_end){
|
||||||
|
$("#addbreakbutton").prop("disabled", true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$("#addbreakbutton").prop("disabled", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -1,22 +1,16 @@
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate
|
from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate, TimeUpdate, AddBreak
|
||||||
'''
|
'''
|
||||||
Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben!
|
Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben!
|
||||||
'''
|
'''
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', TimeManagement, name='tm-management'),
|
path('', TimeManagement, name='tm-management'),
|
||||||
|
path('update/<int:pk>', TimeUpdate, name='tm-update'),
|
||||||
|
path('update/<int:pk>/addbreak/', AddBreak, name='add-break'),
|
||||||
path('abs/', AbsenceManagmenet, name='tma-management'),
|
path('abs/', AbsenceManagmenet, name='tma-management'),
|
||||||
path('abs/<int:activemonth>/<int:activeyear>', AbsenceManagmenet, name='tma-management'),
|
path('abs/<int:activemonth>/<int:activeyear>', AbsenceManagmenet, name='tma-management'),
|
||||||
path('ajax/', TimeAjax, name='tm-ajax'),
|
path('ajax/', TimeAjax, name='tm-ajax'),
|
||||||
path('abs/update/<int:pk>/', AbsenceUpdate, name='tma-update'),
|
path('abs/update/<int:pk>/', AbsenceUpdate, name='tma-update'),
|
||||||
#path('newsadd/', permission_required('users.modulenews')(views.NewsAdd), name='news-add'),
|
|
||||||
#path('newsupdate/<int:id>/', permission_required('users.modulenews')(views.NewsUpdate), name='news-update'),
|
|
||||||
#path('news/<int:pk>/delete', permission_required('users.modulenews')(NewsDeleteView.as_view()), name='news-delete'),
|
|
||||||
|
|
||||||
#path('standard/<int:pk>/changestat', views.StandardChangePublic, name="standard-status"),
|
|
||||||
#path('news/<int:pk>/single', views.NewsSingle, name="news-single"),
|
|
||||||
#path('standard/<int:pk>/area', views.StandardArea, name="standard-area"),
|
|
||||||
#path('standard/<int:pk>/task', views.StandardTask, name="standard-task")
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from django.contrib.auth.models import User
|
||||||
from calendar import monthrange
|
from calendar import monthrange
|
||||||
import datetime
|
import datetime
|
||||||
import calendar
|
import calendar
|
||||||
from .forms import AddAbsence, ConfirmAbsenceForm, UpdateAbsence
|
from .forms import AddAbsence, ConfirmAbsenceForm, UpdateAbsence, UpdateWorkdayForm, AddBreakForm
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from users.models import UserFullName, UserYearAbsenceInfo
|
from users.models import UserFullName, UserYearAbsenceInfo
|
||||||
from users.models import UserTime
|
from users.models import UserTime
|
||||||
|
|
@ -291,20 +291,86 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False):
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def TimeManagement(request):
|
def TimeManagement(request):
|
||||||
|
# TODO: Abwesenheiten mit berücksichtigen!
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"active_link" : "timemanagement",
|
"active_link" : "timemanagement",
|
||||||
"workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("-start")
|
"workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("-start").exclude(end=None)
|
||||||
}
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_management.html', context)
|
return render(request, 'timemanagement/timemanagement_management.html', context)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def TimeUpdate(request, pk):
|
||||||
|
if(request.method == "POST"):
|
||||||
|
form = UpdateWorkdayForm(request.POST, instance=request.user)
|
||||||
|
workday = Workday.objects.get(pk=pk)
|
||||||
|
|
||||||
|
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.start = start
|
||||||
|
workday.end = end
|
||||||
|
workday.target = form["target"].value()
|
||||||
|
workday.save()
|
||||||
|
messages.success(request, f'Arbeitstag aktualisiert')
|
||||||
|
|
||||||
|
return redirect('tm-management')
|
||||||
|
else:
|
||||||
|
context = {
|
||||||
|
"active_link" : "timemanagement",
|
||||||
|
"workday" : Workday.objects.get(pk=pk),
|
||||||
|
"form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk))
|
||||||
|
}
|
||||||
|
return render(request, 'timemanagement/timemanagement_update.html', context)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def AddBreak(request, pk):
|
||||||
|
if(request.method == "POST"):
|
||||||
|
workday = Workday.objects.get(pk=pk)
|
||||||
|
form = AddBreakForm(request.POST, instance=request.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)
|
||||||
|
|
||||||
|
workday.breaks.add(newbreak)
|
||||||
|
workday.save()
|
||||||
|
messages.success(request, f'Pause hinzugefügt')
|
||||||
|
return redirect('tm-update', pk=pk)
|
||||||
|
else:
|
||||||
|
context = {
|
||||||
|
"active_link" : "timemanagement",
|
||||||
|
"workday" : Workday.objects.get(pk=pk),
|
||||||
|
"form" : AddBreakForm(instance=request.user)
|
||||||
|
}
|
||||||
|
return render(request, 'timemanagement/timemanagement_break.html', context)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def TimeAjax(request):
|
def TimeAjax(request):
|
||||||
data = {}
|
data = {}
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
# START WORKDAY
|
# START WORKDAY
|
||||||
if request.GET["action"] == "start_day":
|
if request.GET["action"] == "start_day":
|
||||||
wd = Workday(user=request.user, agency=request.user.profile.agency, start=timezone.now())
|
|
||||||
|
today = date.today()
|
||||||
|
targettime = 0.0
|
||||||
|
if(today.isoweekday() == 1):
|
||||||
|
targettime = request.user.usertime.wd_mo
|
||||||
|
elif(today.isoweekday() == 2):
|
||||||
|
targettime = request.user.usertime.wd_tu
|
||||||
|
elif(today.isoweekday() == 3):
|
||||||
|
targettime = request.user.usertime.wd_we
|
||||||
|
elif(today.isoweekday() == 4):
|
||||||
|
targettime = request.user.usertime.wd_th
|
||||||
|
elif(today.isoweekday() == 5):
|
||||||
|
targettime = request.user.usertime.wd_fr
|
||||||
|
|
||||||
|
wd = Workday(user=request.user, agency=request.user.profile.agency, start=timezone.now(), target=targettime)
|
||||||
wd.save()
|
wd.save()
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"success" : True,
|
"success" : True,
|
||||||
"wd_starttime" : wd.start.strftime("%H:%M:%S"),
|
"wd_starttime" : wd.start.strftime("%H:%M:%S"),
|
||||||
|
|
@ -368,6 +434,84 @@ def TimeAjax(request):
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
data = { "success" : False}
|
data = { "success" : False}
|
||||||
|
# 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):
|
||||||
|
breakwd.delete()
|
||||||
|
data = {
|
||||||
|
"success" : True
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
data = { "success" : False}
|
||||||
|
# LOADING INTIAIL WORKDAYS
|
||||||
|
elif request.GET["action"] == "initial_load":
|
||||||
|
|
||||||
|
allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency, day__gt=request.user.usertime.usetime_start, day__lt=date.today())
|
||||||
|
|
||||||
|
|
||||||
|
weekdays = [6,7]
|
||||||
|
for dt in daterange(request.user.usertime.usetime_start, date.today()):
|
||||||
|
if dt.isoweekday() not in weekdays:
|
||||||
|
in_freedays = False
|
||||||
|
for freeday in allfreedays.all():
|
||||||
|
if(dt == freeday.day):
|
||||||
|
in_freedays = True
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(not in_freedays):
|
||||||
|
# MONDAY
|
||||||
|
if(dt.isoweekday() == 1):
|
||||||
|
start_time = datetime.timedelta(hours=8)
|
||||||
|
start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day))
|
||||||
|
end_time = datetime.timedelta(hours=request.user.usertime.wd_mo) + start_time
|
||||||
|
time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time()
|
||||||
|
time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time()
|
||||||
|
start_datetime = datetime.datetime.combine(start_date, time_start)
|
||||||
|
end_datetime = datetime.datetime.combine(start_date, time_end)
|
||||||
|
|
||||||
|
Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_mo)
|
||||||
|
if(dt.isoweekday() == 2):
|
||||||
|
start_time = datetime.timedelta(hours=8)
|
||||||
|
start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day))
|
||||||
|
end_time = datetime.timedelta(hours=request.user.usertime.wd_tu) + start_time
|
||||||
|
time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time()
|
||||||
|
time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time()
|
||||||
|
start_datetime = datetime.datetime.combine(start_date, time_start)
|
||||||
|
end_datetime = datetime.datetime.combine(start_date, time_end)
|
||||||
|
|
||||||
|
Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_tu)
|
||||||
|
if(dt.isoweekday() == 3):
|
||||||
|
start_time = datetime.timedelta(hours=8)
|
||||||
|
start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day))
|
||||||
|
end_time = datetime.timedelta(hours=request.user.usertime.wd_we) + start_time
|
||||||
|
time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time()
|
||||||
|
time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time()
|
||||||
|
start_datetime = datetime.datetime.combine(start_date, time_start)
|
||||||
|
end_datetime = datetime.datetime.combine(start_date, time_end)
|
||||||
|
|
||||||
|
Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_we)
|
||||||
|
if(dt.isoweekday() == 4):
|
||||||
|
start_time = datetime.timedelta(hours=8)
|
||||||
|
start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day))
|
||||||
|
end_time = datetime.timedelta(hours=request.user.usertime.wd_th) + start_time
|
||||||
|
time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time()
|
||||||
|
time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time()
|
||||||
|
start_datetime = datetime.datetime.combine(start_date, time_start)
|
||||||
|
end_datetime = datetime.datetime.combine(start_date, time_end)
|
||||||
|
|
||||||
|
Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_th)
|
||||||
|
if(dt.isoweekday() == 5):
|
||||||
|
start_time = datetime.timedelta(hours=8)
|
||||||
|
start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day))
|
||||||
|
end_time = datetime.timedelta(hours=request.user.usertime.wd_fr) + start_time
|
||||||
|
time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time()
|
||||||
|
time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time()
|
||||||
|
start_datetime = datetime.datetime.combine(start_date, time_start)
|
||||||
|
end_datetime = datetime.datetime.combine(start_date, time_end)
|
||||||
|
|
||||||
|
Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_fr)
|
||||||
|
|
||||||
# Get Rendered Table
|
# Get Rendered Table
|
||||||
elif request.GET["action"] == "getrenderedtable":
|
elif request.GET["action"] == "getrenderedtable":
|
||||||
prevmonth = ""
|
prevmonth = ""
|
||||||
|
|
@ -440,7 +584,7 @@ def TimeAjax(request):
|
||||||
}
|
}
|
||||||
return render(request, "timemanagement/rendered_table.html", context)
|
return render(request, "timemanagement/rendered_table.html", context)
|
||||||
|
|
||||||
# Get Rendered Table
|
# Prüfung, ob eine Vertretung nötig ist oder nicht
|
||||||
elif request.GET["action"] == "checkrequired":
|
elif request.GET["action"] == "checkrequired":
|
||||||
reason = AbsenceReason.objects.get(pk=request.GET["rid"])
|
reason = AbsenceReason.objects.get(pk=request.GET["rid"])
|
||||||
if(reason.agency == request.user.profile.agency):
|
if(reason.agency == request.user.profile.agency):
|
||||||
|
|
@ -725,3 +869,4 @@ def daterange(date1, date2):
|
||||||
yield date1 + timedelta(n)
|
yield date1 + timedelta(n)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,9 @@ def checkDefaultAbsenceReasons(sender, user, request, **kwargs):
|
||||||
new_ar_education = AbsenceReason(agency=user.profile.agency, name="Fortbildung", color="#2ECC71", need_confirm=True, need_rep=True, is_holiday=False)
|
new_ar_education = AbsenceReason(agency=user.profile.agency, name="Fortbildung", color="#2ECC71", need_confirm=True, need_rep=True, is_holiday=False)
|
||||||
new_ar_education.save()
|
new_ar_education.save()
|
||||||
|
|
||||||
|
new_ar_time = AbsenceReason(agency=user.profile.agency, name="Gleitzeit", color="#9B59B6", need_confirm=True, need_rep=False, is_holiday=False)
|
||||||
|
new_ar_time.save()
|
||||||
|
|
||||||
today = date.today()
|
today = date.today()
|
||||||
|
|
||||||
# FREEDAYS LADEN
|
# FREEDAYS LADEN
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,7 @@
|
||||||
|
|
||||||
<a class="nav-link " href="{% url 'chat:chat-management' %}" aria-expanded="true">
|
<a class="nav-link " href="{% url 'chat:chat-management' %}" aria-expanded="true">
|
||||||
<i class="fas fa-comments"></i>
|
<i class="fas fa-comments"></i>
|
||||||
<span>Chat</span>
|
<span>Chat <sup>BETA</sup></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -175,7 +175,7 @@
|
||||||
{%endif%}
|
{%endif%}
|
||||||
<a class="nav-link " href="{% url 'tma-management' %}" aria-expanded="true">
|
<a class="nav-link " href="{% url 'tma-management' %}" aria-expanded="true">
|
||||||
<i class="fas fa-umbrella-beach"></i>
|
<i class="fas fa-umbrella-beach"></i>
|
||||||
<span>Abwesenheiten</span>
|
<span>Abwesenheiten <sup>BETA</sup></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -188,7 +188,7 @@
|
||||||
{%endif%}
|
{%endif%}
|
||||||
<a class="nav-link " href="{% url 'tm-management' %}" aria-expanded="true">
|
<a class="nav-link " href="{% url 'tm-management' %}" aria-expanded="true">
|
||||||
<i class="far fa-clock"></i>
|
<i class="far fa-clock"></i>
|
||||||
<span>Zeiterfassung</span>
|
<span>Zeiterfassung <sup>BETA</sup></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -310,7 +310,7 @@
|
||||||
</style>
|
</style>
|
||||||
<!-- Topbar Navbar -->
|
<!-- Topbar Navbar -->
|
||||||
<ul class="navbar-nav ml-auto ">
|
<ul class="navbar-nav ml-auto ">
|
||||||
{% if request.user.usertime.usetime %}
|
{% if request.user.usertime.usetime and user.usertime.usetime_start != None %}
|
||||||
<li class="nav-item dropdown no-arrow mx-1">
|
<li class="nav-item dropdown no-arrow mx-1">
|
||||||
<a class="nav-link dropdown-toggle" onclick="" id="timemanagement_realtime" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<a class="nav-link dropdown-toggle" onclick="" id="timemanagement_realtime" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<i class="far fa-clock"></i>
|
<i class="far fa-clock"></i>
|
||||||
|
|
@ -327,10 +327,6 @@
|
||||||
</div>
|
</div>
|
||||||
<a class="dropdown-item text-center small text-gray-500" href="{% url 'tm-management' %}">Zur Zeiterfassung</a>
|
<a class="dropdown-item text-center small text-gray-500" href="{% url 'tm-management' %}">Zur Zeiterfassung</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue