Zeiterfassung ausser Abwesenheiten fertig

This commit is contained in:
Holger Trampe 2020-05-30 19:52:00 +02:00
parent 642e1ee8bb
commit ee77bb43c4
13 changed files with 588 additions and 58 deletions

View File

@ -8,7 +8,7 @@ import os
from django.conf import settings
from django.utils import timezone
from datetime import date
import datetime
register = template.Library()
b = 0
@ -273,7 +273,7 @@ def getactualworkingday(user):
returnstat = 0
if(len(wd) > 0):
returnstat = list(wd)[0].start
returnstat = list(wd)[0].start
return returnstat
# Return formatted Time-String
@ -350,7 +350,7 @@ def getdailybreaktime(user):
@register.simple_tag
def getdailybreaktimetoday(user):
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
for b in wd.breaks.all():
if(b.end != None):
@ -372,7 +372,16 @@ def getsumworkday(workday):
mon, sec = divmod(finalsum, 60)
hr, mon = divmod(mon, 60)
#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
def getsumbreak(workday):
@ -507,3 +516,81 @@ def startdatecheck(usertocheck, day):
return True
else:
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]

View File

@ -1,7 +1,7 @@
from bootstrap_datepicker_plus import DatePickerInput
from django import forms
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 django.forms import HiddenInput
@ -136,4 +136,50 @@ class AddFreeDayForm(forms.ModelForm):
def __init__(self, *arg, **kwargs):
super(AddFreeDayForm, self).__init__(*arg, **kwargs)
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

View File

@ -11,6 +11,7 @@ class Workday(models.Model):
breaks = models.ManyToManyField("Breaks", blank=True, related_name='breaks_at_day')
start = 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):
user = models.ForeignKey(User, on_delete=models.CASCADE)

View File

@ -29,7 +29,13 @@
<button onclick="javascript:startDay()" type="button" id="" class="btn btn-success">Arbeitstag starten</button>
</div>
<hr>
Gleitzeitkonto: +00:13 Stunden
{% loadaccounttime user as actualaccounttime %}
Gleitzeitkonto:
{% if actualaccounttime.1 == 0 %}
<b><span style="color: green">+{{actualaccounttime.0}}&nbsp;Stunden</span></b>
{% else %}
<b><span style="color: red">-{{actualaccounttime.0}}&nbsp;Stunden</span></b>
{% endif %}
</div>
<script type="text/javascript">
@ -109,25 +115,33 @@ Gleitzeitkonto: +00:13 Stunden
{% else %}
var isbreak = false;
var startbreaktime_view = 0;
var starttime_view = Date.parse("{{starttime}}");
var starttime_view = parseDate("{{starttime}}");
$("#start_workday").hide();
$("#activeDay").show();
$("#starttime").html("{{formattetstarttime}}");
{% 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);
starttime_view = startDate;
realTimeClock();
start = false;
realTimeClock();
}
else{
now = new Date();
@ -217,8 +231,8 @@ Gleitzeitkonto: +00:13 Stunden
$("#endtime").html("00:00:00");
$("#breaksum").html("00:00:00");
}
realTimeClock(data["wd_starttime_complete"]);
start = data["wd_starttime_complete"];
realTimeClock();
}
});
@ -252,10 +266,12 @@ Gleitzeitkonto: +00:13 Stunden
$("#breaksum").html(convertMS(data["actualbreaktime"]));
starttime_view = false;
isbreak = false;
start = false;
breaktime = 0;
}
realTimeClock(data["wd_starttime_complete"]);
//start = data["wd_starttime_complete"]
realTimeClock();
}
});

View File

@ -459,7 +459,7 @@ function recalculateChoosenDaysAfterInit(){
$("#detail_tocontract").html(data["need_days"]);
$("#detail_tocontract_overall").html(data["need_days"]);
$("#detail_next_rest").html(data["restholiday_nextyear_rest"]);
if(data["two_years"] == true){
$("#detail_tocontract").html(data["need_days_this"]);
$("#two_years").show();
@ -482,7 +482,7 @@ function recalculateChoosenDaysAfterInit(){
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);
}
else{

View File

@ -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 %}

View File

@ -14,9 +14,8 @@
<th scope="col">Ende</th>
<th scope="col">Arbeitszeit</th>
<th scope="col">Pausen</th>
<th scope="col">Gesamtzeit</th>
<th scope="col">Abwesenheit</th>
<th scope="col">Gleitzeit in h</th>
<th scope="col">Gesamtzeit</th>
<th scope="col">Gleitzeit</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
@ -27,31 +26,36 @@
{{forloop.counter}}
</td>
<td>
{{workday.start}}
{{workday.start|date:"d.m.y H:i"}}
</td>
<td>
{{workday.end}}
{{workday.end|date:"d.m.y H:i"}}
</td>
<td>
{{ workday.end|timeuntil:workday.start }}
{% getsumworkdayexcludebreak workday as sumworkday %}
{{ sumworkday }}
</td>
<td>
{% getsumbreak workday as sumbreakofday %}
{{sumbreakofday}} min. ({{workday.breaks.all|length}})
{{sumbreakofday}} min. ({{workday.breaks.all|length}})
</td>
<td>
{% getsumworkday workday as sumwd %}
{{sumwd}}
</td>
<td>
DROPDOWN
</td>
<td>
{% 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>
<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>
<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>
<button class="btn btn-secondary btn-sm " onclick="javascript:$('#confirm-delete_{{workday.pk}}').modal('toggle')"><small><i class="fas fa-trash"></i></small></button>
</td>
</tr>
@ -60,6 +64,82 @@
</table>
</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">&times;</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">&times;</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 %}
<div class="modal fade" id="confirm-delete_{{workday.pk}}" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true">
<div class="modal-dialog">

View File

@ -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">&nbsp;</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 %}

View File

@ -1,22 +1,16 @@
from django.urls import path
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!
'''
urlpatterns = [
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/<int:activemonth>/<int:activeyear>', AbsenceManagmenet, name='tma-management'),
path('ajax/', TimeAjax, name='tm-ajax'),
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")
]

View File

@ -11,7 +11,7 @@ from django.contrib.auth.models import User
from calendar import monthrange
import datetime
import calendar
from .forms import AddAbsence, ConfirmAbsenceForm, UpdateAbsence
from .forms import AddAbsence, ConfirmAbsenceForm, UpdateAbsence, UpdateWorkdayForm, AddBreakForm
from django.contrib import messages
from users.models import UserFullName, UserYearAbsenceInfo
from users.models import UserTime
@ -291,20 +291,86 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False):
@login_required
def TimeManagement(request):
# TODO: Abwesenheiten mit berücksichtigen!
context = {
"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)
@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
def TimeAjax(request):
data = {}
if request.method == "GET":
# START WORKDAY
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()
data = {
"success" : True,
"wd_starttime" : wd.start.strftime("%H:%M:%S"),
@ -368,6 +434,84 @@ def TimeAjax(request):
}
else:
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
elif request.GET["action"] == "getrenderedtable":
prevmonth = ""
@ -440,7 +584,7 @@ def TimeAjax(request):
}
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":
reason = AbsenceReason.objects.get(pk=request.GET["rid"])
if(reason.agency == request.user.profile.agency):
@ -725,3 +869,4 @@ def daterange(date1, date2):
yield date1 + timedelta(n)

View File

@ -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.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()
# FREEDAYS LADEN

View File

@ -162,7 +162,7 @@
<a class="nav-link " href="{% url 'chat:chat-management' %}" aria-expanded="true">
<i class="fas fa-comments"></i>
<span>Chat</span>
<span>Chat&nbsp;<sup>BETA</sup></span>
</a>
</li>
{% endif %}
@ -175,7 +175,7 @@
{%endif%}
<a class="nav-link " href="{% url 'tma-management' %}" aria-expanded="true">
<i class="fas fa-umbrella-beach"></i>
<span>Abwesenheiten</span>
<span>Abwesenheiten&nbsp;<sup>BETA</sup></span>
</a>
</li>
{% endif %}
@ -188,7 +188,7 @@
{%endif%}
<a class="nav-link " href="{% url 'tm-management' %}" aria-expanded="true">
<i class="far fa-clock"></i>
<span>Zeiterfassung</span>
<span>Zeiterfassung&nbsp;<sup>BETA</sup></span>
</a>
</li>
{% endif %}
@ -310,7 +310,7 @@
</style>
<!-- Topbar Navbar -->
<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">
<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>
@ -327,10 +327,6 @@
</div>
<a class="dropdown-item text-center small text-gray-500" href="{% url 'tm-management' %}">Zur Zeiterfassung</a>
</div>
</li>
{% endif %}