Zeiterfassung vorbereitet, Abwesenheit fehlt noch bearbeiten

This commit is contained in:
Holger Trampe 2020-05-30 01:27:40 +02:00
parent 763a3a5247
commit 9719fe6457
11 changed files with 72 additions and 39 deletions

View File

@ -7,16 +7,6 @@ from bootstrap_datepicker_plus import DatePickerInput
from django.utils.translation import gettext as _
from timemanagement.models import AbsenceReason
class AgencyTimeManagement(forms.ModelForm):
class Meta:
model = Agency
fields = ['module_timemanagement_ze']
labels = {
'module_timemanagement_ze' : "Zeiterfassung aktivieren"
}
class AgencyOrganigrammForm(forms.ModelForm):
class Meta:
model = Agency
@ -36,7 +26,6 @@ class AgencyNetworkForm(forms.ModelForm):
"publicjoin" : "Beitritt ohne Bestätigung"
}
# Change logged Users Data (Usernamen an Email) NUR HIER MÖGLICH!
class UsersSelfChangeForm(forms.ModelForm):
email = forms.EmailField()
@ -74,16 +63,21 @@ class UserTimeForm(forms.ModelForm):
"wd_tu" : "Dienstag",
"wd_we" : "Mittwoch",
"wd_th" : "Donnerstag",
"wd_fr" : "Freitag",
"wd_fr" : "Freitag",
"usetime" : "Zeiterfassung" ,
"usetime_start" : "Zeiterfassung ab"
}
fields = ["startdate", "wd_mo", "wd_tu", "wd_we", "wd_th", "wd_fr", "loose_holidedate"]
fields = ["startdate", "usetime", "usetime_start", "wd_mo", "wd_tu", "wd_we", "wd_th", "wd_fr", "loose_holidedate"]
widgets = {
"startdate" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'})
"startdate" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}),
"usetime_start" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'})
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['startdate'].required = True
self.fields['usetime_start'].required = False
self.fields['usetime'].required = False
# PERMISSION GROUPS FORM
@ -116,8 +110,8 @@ class AgencyModulsForm(forms.ModelForm):
'module_organigramm' : "Organigramm",
'module_messages' : "Mitteilungen",
'module_chat' : "Chat",
#'module_timemanagement' : "Abwesenheits- und Zeiterfassung",
'module_timemanagement' : "Abwesenheitsplanung",
'module_timemanagement' : "Abwesenheits- und Zeiterfassung",
#'module_timemanagement' : "Abwesenheitsplanung",
}
fields = ['module_news','module_organizer','module_files','module_organigramm', 'module_messages', 'module_chat', 'module_timemanagement']

View File

@ -48,7 +48,7 @@
type: "GET",
url: "{% url 'modsettings-tm' %}",
data:{
aze: $("#id_module_timemanagement_ze").prop('checked')
//aze: $("#id_module_timemanagement_ze").prop('checked')
},
success: function( data )
{

View File

@ -164,9 +164,17 @@
<form method="POST" enctype="multipart/form-data" name="usertime_basic">
{% csrf_token %}
<input type="hidden" name="form_type" value="contract">
<h5>Arbeitszeiten&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Legen Sie fest, an welchen Tagen dieser Mitarbeiter wie viele Stunden arbeitet." class="far fa-question-circle"></i></small></h5>
<div class="table-responsive">
<h5>Zeiterfassung&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Legen Sie fest, ob dieser Mitarbeit seine Arbeitszeit erfassen soll." class="far fa-question-circle"></i></small></h5>
<div class="row">
<div class="col-3">
{{usertime_form.usetime|as_crispy_field}}
</div>
<div class="col-5">
{{usertime_form.usetime_start|as_crispy_field}}
</div>
</div>
<h5>Arbeitszeiten&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Legen Sie fest, an welchen Tagen dieser Mitarbeiter wie viele Stunden arbeitet." class="far fa-question-circle"></i></small></h5>
<div class="table-responsive">
<table class="table">
<tr>
<td>{{usertime_form.wd_mo|as_crispy_field}}</td>

View File

@ -1,7 +1,7 @@
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect,HttpResponse, JsonResponse
from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm, AgencyOrganigrammForm, UserTimeForm, AgencyTimeManagement, AbsenceReasonForm
from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm, AgencyOrganigrammForm, UserTimeForm, AbsenceReasonForm
from django.contrib import messages
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
@ -78,8 +78,8 @@ def getAllForms(request, context):
context.update({'modsettings_organigramm' : modsettings_organigramm})
#Modulsettings ABWESENHEIT- UND ZEITERFASSUNG
modsettings_tm = AgencyTimeManagement(instance=request.user.profile.agency)
context.update({'modsettings_tm' : modsettings_tm})
#modsettings_tm = AgencyTimeManagement(instance=request.user.profile.agency)
#context.update({'modsettings_tm' : modsettings_tm})
context.update({"modsettings_tm_abcat" : AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name") })
@ -335,7 +335,7 @@ def SettingsAgencyModuls(request, context):
# Check, if Timemanagement is deactivate, to deactivate Zeiterfassung
if(request.user.profile.agency.module_timemanagement == False):
ag = request.user.profile.agency
ag.module_timemanagement_ze = False
#ag.module_timemanagement_ze = False
if(request.user.has_perm("users.modulesconfig")):
FreeDays.objects.filter(agency=request.user.profile.agency).delete()
@ -1282,9 +1282,12 @@ def ModSettingsOrga(request):
return JsonResponse({})
else:
return JsonResponse({})
@login_required
def ModSettingsTm(request):
return JsonResponse({})
'''
if request.method == 'GET' and request.user.has_perm("users.modulesconfig"):
if(request.GET['aze'] == "true"):
ag = request.user.profile.agency
@ -1297,4 +1300,4 @@ def ModSettingsTm(request):
return JsonResponse({})
else:
return JsonResponse({})
'''

View File

@ -1,6 +1,6 @@
{% load crispy_forms_tags %}
{% load mathfilters %}
<h5>Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen oder ablehnen</h5>
<h5>Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen/ablehnen</h5>
<hr>
<h6>Informationen der Abwesenheit</h6>
Von: {{absence.start|date:"d.m Y"}}<br />
@ -25,6 +25,16 @@ Informationen: {{absence.info}}<br />
</tr>
</tbody>
</table>
{% if other_absences_string != False %}
<div id="otherholidays">
<hr>
<h5>Andere Abwesenheiten in diesem Zeitraum</h5>
{% for ele in other_absences_string %}
{{ele}}<br />
{% endfor %}
</div>
<hr>
{% endif %}
<form method="POST">
<input type="hidden" name="form_type" value="confirmform">
{% csrf_token %}

View File

@ -1,7 +1,7 @@
{% extends "users/base.html" %}
{% block content %}
{% load counter_tag %}
{% if request.user.profile.agency.module_timemanagement_ze %}
{% if request.user.profile.agency.module_timemanagement %}
<div class="content-section col-12">
<h3>Zeiterfassung&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Bearbeiten Sie hier Ihre Zeiterfassung." class="far fa-question-circle"></i></small></h3>
<hr>

View File

@ -3,7 +3,8 @@
<table class="table table-hover" id="table_allabsences">
<thead>
<tr>
<th scope="col">Mitarbeiter</th>
<th scope="col">Vorname</th>
<th scope="col">Nachname</th>
<th scope="col">Start</th>
<th scope="col">Ende</th>
<th scope="col">Grund</th>
@ -15,7 +16,8 @@
<tbody id="">
{% for abday in allabsences %}
<tr id="tableele_ab_{{abday.pk}}">
<td>{{abday.user.first_name}} {{abday.user.last_name}}</td>
<td>{{abday.user.first_name}}</td>
<td>{{abday.user.last_name}}</td>
<td>{{abday.start|date:"d.M Y"}}</td>
<td>{{abday.end|date:"d.M Y"}}</td>
<td>{{abday.reason.name}}</td>

View File

@ -5,12 +5,12 @@
<div class="card">
<div class="card-body">
<!-- CANVAS -->
<h6>Urlaubsübersicht</h6>
<h6>Urlaubsübersicht {{activeyear}}</h6>
<div class="chart-container" style="">
<canvas id="datainfo_reason"></canvas>
</div>
<hr>
<h6>Übersicht nach Abwesenheitskategorien</h6>
<h6>Übersicht nach Abwesenheitskategorien {{activeyear}}</h6>
<div class="chart-container" style="">
<canvas id="datainfo_restdays"></canvas>
</div>

View File

@ -167,10 +167,11 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False):
# ABSENCE AUFLISTUNG NACH GRUND
allreasons = AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name")
final_reasons = []
for ar in allreasons:
tempabsece = Absence.objects.filter(reason=ar, user=request.user)
tempabsece = Absence.objects.filter(reason=ar, user=request.user, start__year=activeyear)
temp_sum = 0.0
for t in tempabsece:
temp_sum += calculatingHolidaysByAbsence(request, t)
@ -379,7 +380,7 @@ 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:
@ -387,9 +388,21 @@ def TimeAjax(request):
except:
timeinfo_nextyear = False
# POrüfen, ob es in diesem Zeitraum noch andere Abwesenheiten gibt
other_absences = Absence.objects.filter(start__lte=absence.start, end__gte=absence.end, agency=request.user.profile.agency).exclude(user=absence.user)
other_absences_string = False
if (len(other_absences) > 0):
other_absences_string = []
for a in other_absences:
other_absences_string.append(a.user.first_name + " " + a.user.last_name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y"))
context = {
"confirmform" : ConfirmAbsenceForm(instance=request.user),
"absence" : absence,
"other_absences_string" : other_absences_string,
"timeinfo_thisyear" : timeinfo_thisyear,
"timeinfo_nextyear" : timeinfo_nextyear
}
@ -516,7 +529,8 @@ 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)
# POrüfen, ob es in diesem Zeitraum noch andere Abwesenheiten gibt
other_absences = Absence.objects.filter(start__lte=start_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency)
other_absences_string = False
if (len(other_absences) > 0):

View File

@ -107,7 +107,7 @@ class Agency(models.Model):
module_timemanagement = models.BooleanField(default=False)
module_timemanagement_price = models.FloatField(default=10.0, max_length=9, blank=True)
# Zeiterfassung Ja/Nein
module_timemanagement_ze = models.BooleanField(default=False)
#module_timemanagement_ze = models.BooleanField(default=False)
vve = models.CharField(default="", max_length=200, blank=True)
@ -262,6 +262,8 @@ class UserTime(models.Model):
wd_fr = models.FloatField(default=8.0)
loose_holidedate = models.CharField(default="30.04.", max_length=6)
startdate = models.DateField(default=None, blank=True, null=True)
usetime = models.BooleanField(default=False)
usetime_start = models.DateField(default=None, blank=True, null=True)
class UserYearAbsenceInfo(models.Model):

View File

@ -180,7 +180,7 @@
</li>
{% endif %}
{% if request.user.profile.agency.module_timemanagement_ze %}
{% if request.user.usertime.usetime %}
{% if active_link == 'timemanagement' %}
<li class="nav-item active">
{% else%}
@ -309,8 +309,8 @@
}
</style>
<!-- Topbar Navbar -->
<ul class="navbar-nav ml-auto ">
{% if request.user.profile.agency.module_timemanagement_ze %}
<ul class="navbar-nav ml-auto ">
{% if request.user.usertime.usetime %}
<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>