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

View File

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

View File

@ -164,9 +164,17 @@
<form method="POST" enctype="multipart/form-data" name="usertime_basic"> <form method="POST" enctype="multipart/form-data" name="usertime_basic">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="form_type" value="contract"> <input type="hidden" name="form_type" value="contract">
<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>
<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="row">
<div class="table-responsive"> <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"> <table class="table">
<tr> <tr>
<td>{{usertime_form.wd_mo|as_crispy_field}}</td> <td>{{usertime_form.wd_mo|as_crispy_field}}</td>

View File

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

View File

@ -1,6 +1,6 @@
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% load mathfilters %} {% 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> <hr>
<h6>Informationen der Abwesenheit</h6> <h6>Informationen der Abwesenheit</h6>
Von: {{absence.start|date:"d.m Y"}}<br /> Von: {{absence.start|date:"d.m Y"}}<br />
@ -25,6 +25,16 @@ Informationen: {{absence.info}}<br />
</tr> </tr>
</tbody> </tbody>
</table> </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"> <form method="POST">
<input type="hidden" name="form_type" value="confirmform"> <input type="hidden" name="form_type" value="confirmform">
{% csrf_token %} {% csrf_token %}

View File

@ -1,7 +1,7 @@
{% extends "users/base.html" %} {% extends "users/base.html" %}
{% block content %} {% block content %}
{% load counter_tag %} {% load counter_tag %}
{% if request.user.profile.agency.module_timemanagement_ze %} {% if request.user.profile.agency.module_timemanagement %}
<div class="content-section col-12"> <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> <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> <hr>

View File

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

View File

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

View File

@ -167,10 +167,11 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False):
# ABSENCE AUFLISTUNG NACH GRUND # ABSENCE AUFLISTUNG NACH GRUND
allreasons = AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name") allreasons = AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name")
final_reasons = [] final_reasons = []
for ar in allreasons: 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 temp_sum = 0.0
for t in tempabsece: for t in tempabsece:
temp_sum += calculatingHolidaysByAbsence(request, t) temp_sum += calculatingHolidaysByAbsence(request, t)
@ -379,7 +380,7 @@ def TimeAjax(request):
} }
# GET FORM FOR CONFIRM ABSENCE # GET FORM FOR CONFIRM ABSENCE
elif request.GET["action"] == "getrenderedform": elif request.GET["action"] == "getrenderedform":
absence = Absence.objects.get(pk=request.GET["abscenceid"]) absence = Absence.objects.get(pk=request.GET["abscenceid"])
timeinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year, user=absence.user))[0] timeinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year, user=absence.user))[0]
try: try:
@ -387,9 +388,21 @@ def TimeAjax(request):
except: except:
timeinfo_nextyear = False 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 = { context = {
"confirmform" : ConfirmAbsenceForm(instance=request.user), "confirmform" : ConfirmAbsenceForm(instance=request.user),
"absence" : absence, "absence" : absence,
"other_absences_string" : other_absences_string,
"timeinfo_thisyear" : timeinfo_thisyear, "timeinfo_thisyear" : timeinfo_thisyear,
"timeinfo_nextyear" : timeinfo_nextyear "timeinfo_nextyear" : timeinfo_nextyear
} }
@ -516,7 +529,8 @@ def TimeAjax(request):
days_nextyear_rest = need_days_next + temprest days_nextyear_rest = need_days_next + temprest
days_nextyear_normal = temprest * -1 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 other_absences_string = False
if (len(other_absences) > 0): if (len(other_absences) > 0):

View File

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

View File

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