Bugs und Zeiterfassung QS
This commit is contained in:
parent
a38e6e682e
commit
5d49d05ebd
|
|
@ -4,7 +4,7 @@
|
||||||
{% load counter_tag %}
|
{% load counter_tag %}
|
||||||
{% if request.user.profile.agency.module_timemanagement %}
|
{% if request.user.profile.agency.module_timemanagement %}
|
||||||
<div class="content-section col-5">
|
<div class="content-section col-5">
|
||||||
<h3>Arbeitstag hinzufügen</h3>
|
<h3>Arbeitstag {% if team == 1 %} von {{user.get_full_name}} {% endif %} hinzufügen</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<h5>Start- und Endzeitpunkt</h5>
|
<h5>Start- und Endzeitpunkt</h5>
|
||||||
<div class="col-6" style="margin-left: -10px;">
|
<div class="col-6" style="margin-left: -10px;">
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
ÜBERSICHT
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
<tbody id="tableresults">
|
<tbody id="tableresults">
|
||||||
{% for item in usersofagency %}
|
{% for item in usersofagency %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{item.first_name }}</a></td>
|
<td>{{item.first_name }}</td>
|
||||||
<td><a href="{% url 'user_updateprofile' item.pk 0 %}">{{ item.last_name }}</a></td>
|
<td>{{ item.last_name }}</td>
|
||||||
<td>{{ item.email }}</td>
|
<td>{{ item.email }}</td>
|
||||||
<td>{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%}</td>
|
<td>{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%}</td>
|
||||||
<td>
|
<td>
|
||||||
|
|
@ -34,21 +34,20 @@
|
||||||
</td>
|
</td>
|
||||||
<td>{% if item.last_login != Nonte %}{{ item.last_login }}{% endif %}</td>
|
<td>{% if item.last_login != Nonte %}{{ item.last_login }}{% endif %}</td>
|
||||||
<td>
|
<td>
|
||||||
{% if item != request.user %}
|
{% if item.usertime.usetime %}
|
||||||
<a href="{% url 'users-delete' item.pk %}" ><button class="btn btn-sm btn-secondary"><i class="fas fa-trash"></i></button></a>
|
<a href="{% url 'tm-team-single' item.pk %}" ><button class="btn btn-sm btn-primary"><i class="fas fa-eye"></i></button></a>{% else %}
|
||||||
{% endif %}
|
Mitarbeiter macht keine Zeiterfassung.
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
|
||||||
$('#usertableall').DataTable({
|
$('#usertableall').DataTable({
|
||||||
"order" : [],
|
|
||||||
"language": {
|
"language": {
|
||||||
"search" : "Suche",
|
"search" : "Suche",
|
||||||
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
||||||
|
|
@ -62,11 +61,12 @@ $(document).ready(function(){
|
||||||
"previous": "Zurück"
|
"previous": "Zurück"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"pageLength": 50,
|
|
||||||
"buttons" : {
|
"buttons" : {
|
||||||
"className" : "btn-danger"
|
"className" : "btn-danger"
|
||||||
}
|
},
|
||||||
|
"pageLength": 50,
|
||||||
|
"order": [[ 1, "asc" ]]
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -0,0 +1,431 @@
|
||||||
|
{% extends "users/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
{% load counter_tag %}
|
||||||
|
<h3>Zeiterfassung von {{user.get_full_name}} bearbeiten
|
||||||
|
<a type="button" class="btn btn-primary btn-sm" style="position: relative; float: right !important;" href="{% url 'tm-add' 1 user.pk %}"><i class="fas fa-plus"></i> Arbeitstag</a>
|
||||||
|
</h3>
|
||||||
|
<hr>
|
||||||
|
<div class="btn-group" role="group" aria-label="" style="min-width: 100% !important">
|
||||||
|
<a type="button" class="btn btn-primary mr-1" href="{% url 'tm-team-single' user.pk prev_month prev_year %}" ><i class="fas fa-arrow-circle-left"></i></a>
|
||||||
|
<button type="button" class="btn btn-primary mr-1" style="min-width: 150px !important;" onclick="javascript:fastChangeModal()">{{active_month}} {{active_year}}</button>
|
||||||
|
<a type="button" class="btn btn-primary mr-1" href="{% url 'tm-team-single' user.pk next_month next_year %}"><i class="fas fa-arrow-circle-right"></i></a>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="table-responsive ">
|
||||||
|
<table class="table table-hover" id="table_timemanagement" >
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col"></th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
<th scope="col">Start</th>
|
||||||
|
<th scope="col">Ende</th>
|
||||||
|
<th scope="col">Arbeitszeit</th>
|
||||||
|
<th scope="col">Pausen</th>
|
||||||
|
<th scope="col">Gesamtzeit</th>
|
||||||
|
<th scope="col">Gleitzeit</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="table_contacts" >
|
||||||
|
{% for da in days_this_month %}
|
||||||
|
|
||||||
|
{% getabscenceday user user da as abday %}
|
||||||
|
|
||||||
|
<tr id="da_{{da|date:"d-m-y"}}"
|
||||||
|
{% if da.weekday == 5 or da.weekday == 6 %}
|
||||||
|
style="background-color: #d3d3d3;"
|
||||||
|
{% elif abday != False %}
|
||||||
|
style="background-color: {{abday.reason.color}}; color: #ffffff"
|
||||||
|
{% endif %}>
|
||||||
|
<td>
|
||||||
|
{{da|date:"l"}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{da|date:"d.m.y"}}
|
||||||
|
</td>
|
||||||
|
<td {% if abday != False %} colspan="3" {% endif %}>
|
||||||
|
{% if abday != False %}
|
||||||
|
{{abday.reason}}
|
||||||
|
{% if abday.start == da%}
|
||||||
|
{% if abday.startday_info == "1" %}
|
||||||
|
(nur Vormittags)
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
<br />
|
||||||
|
{{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}},
|
||||||
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }},
|
||||||
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}}),
|
||||||
|
{% getsumworkday workday as sumwd %}
|
||||||
|
{{sumwd}},
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk 1 %}'"><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>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% elif abday.startday_info == "2" %}
|
||||||
|
(nur Nachmittags)
|
||||||
|
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
<br />
|
||||||
|
{{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}
|
||||||
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }},
|
||||||
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}}),
|
||||||
|
{% getsumworkday workday as sumwd %}
|
||||||
|
{{sumwd}},
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
|
||||||
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk 1 %}'"><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>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% elif abday.end == da%}
|
||||||
|
{% if abday.endday_info == "1" %}
|
||||||
|
(nur Vormittags)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
<br />
|
||||||
|
{{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}
|
||||||
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }},
|
||||||
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}}),
|
||||||
|
{% getsumworkday workday as sumwd %}
|
||||||
|
{{sumwd}},
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
|
||||||
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk 1 %}'"><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>
|
||||||
|
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% elif abday.endday_info == "2" %}
|
||||||
|
(nur Nachmittags)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
<br />
|
||||||
|
{{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}
|
||||||
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }},
|
||||||
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}}),
|
||||||
|
{% getsumworkday workday as sumwd %}
|
||||||
|
{{sumwd}},
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
|
||||||
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk 1 %}'"><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>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{% if abday == False %}
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
{{workday.start|date:"H:i"}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
{% if abday == False %}
|
||||||
|
<td>
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.end|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
|
||||||
|
{{workday.end|date:"H:i"}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
|
||||||
|
{% getsumworkdayexcludebreak workday as sumworkday %}
|
||||||
|
{{ sumworkday }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
|
||||||
|
{% getsumbreak workday as sumbreakofday %}
|
||||||
|
{{sumbreakofday}} min. ({{workday.breaks.all|length}})
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
|
||||||
|
{% getsumworkday workday as sumwd %}
|
||||||
|
{{sumwd}}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
{% counterWDUp %}
|
||||||
|
{% 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 %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
{% counterWDreset %}
|
||||||
|
{% for workday in workdays %}
|
||||||
|
{% if workday.start|date:"d-m-y" == da|date:"d-m-y" %}
|
||||||
|
|
||||||
|
{% getCounterWD as wd_counter %}
|
||||||
|
|
||||||
|
{% if wd_counter > 0 %}
|
||||||
|
<br />
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
{% counterWDUp %}
|
||||||
|
|
||||||
|
<button class="btn btn-secondary btn-sm ml-2" onclick="window.location.href='{% url 'tm-update' workday.pk 1 %}'"><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>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</td>
|
||||||
|
{% else %}
|
||||||
|
<td></td><td></td><td></td><td></td><td style="display: none;"></td><td style="display: none;"></td>
|
||||||
|
{% endif %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" tabindex="-1" id="fastjumpmodal" data-backdrop="static">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Zeitraum auswählen</h5>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="exampleFormControlSelect1">Jahr auswählen</label>
|
||||||
|
{% getsomeyears active_year as years %}
|
||||||
|
<select class="form-control" id="choosenyear">
|
||||||
|
{% for y in years %}
|
||||||
|
<option val="{{y}}" {% if y == active_year %} selected {% endif %}>{{y}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{% getsomemonths as months %}
|
||||||
|
{% for m in months %}
|
||||||
|
<button class="btn
|
||||||
|
{% if forloop.counter == activemonth %} btn-primary {% else %} btn-secondary {% endif %}
|
||||||
|
btn-sm mr-2 mb-2" onclick="javascript:goFastToMonth({{forloop.counter}})">{{m}}</button>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-primary " data-dismiss="modal">Schließen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% 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">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Arbeitstag von {{user.get_full_name}} löschen</h5>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
Möchten Sie wirklich den Arbeitstag am {{workday.start|date:"d.m"}} löschen?
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-primary" id="dodel_{{workday.pk}}" >Löschen</button>
|
||||||
|
<button type="button" class="btn" data-dismiss="modal">Abbrechen</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$("#dodel_{{workday.pk}}").click(function(){
|
||||||
|
$.ajax(
|
||||||
|
{
|
||||||
|
type: "GET",
|
||||||
|
url: "{% url 'tm-ajax' %}",
|
||||||
|
data:{
|
||||||
|
action : "remove_workday",
|
||||||
|
workday: {{workday.pk}},
|
||||||
|
},
|
||||||
|
success: function( data )
|
||||||
|
{
|
||||||
|
location.href = location.href;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function fastChangeModal(){
|
||||||
|
$("#fastjumpmodal").modal("toggle");
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
$('#table_timemanagement').DataTable({
|
||||||
|
"language": {
|
||||||
|
"search" : "Suche",
|
||||||
|
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
||||||
|
"lengthMenu": "Zeige _MENU_ Einträge",
|
||||||
|
"zeroRecords": "Nichts gefunden",
|
||||||
|
"infoEmpty": "Keine Einträge",
|
||||||
|
"paginate": {
|
||||||
|
"first": "Erste",
|
||||||
|
"last": "Letzte",
|
||||||
|
"next": "Nächste",
|
||||||
|
"previous": "Zurück"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"buttons" : {
|
||||||
|
"className" : "btn-danger"
|
||||||
|
},
|
||||||
|
"pageLength": 50,
|
||||||
|
"order": [[ 1, "asc" ]]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
{% if request.user.profile.agency.module_timemanagement %}
|
{% if request.user.profile.agency.module_timemanagement %}
|
||||||
<div class="content-section col-5">
|
<div class="content-section col-5">
|
||||||
|
|
||||||
<h3>Arbeitstag am {{workday.start|date:"d.m.Y"}} bearbeiten</h3>
|
<h3>Arbeitstag am {{workday.start|date:"d.m.Y"}} {% if team == 1 %} von {{user.get_full_name}} {% endif %} bearbeiten</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<h5>Start- und Endzeitpunkt</h5>
|
<h5>Start- und Endzeitpunkt</h5>
|
||||||
<div class="col-6" style="margin-left: -10px;">
|
<div class="col-6" style="margin-left: -10px;">
|
||||||
|
|
@ -16,7 +16,11 @@
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<h5>Pausen
|
<h5>Pausen
|
||||||
|
{% if team == 1 %}
|
||||||
|
<a class="btn btn-primary btn-sm" style="float: right" href="{% url 'add-break' workday.pk 1 %}"><i class="fas fa-plus"></i></a>
|
||||||
|
{% else %}
|
||||||
<a class="btn btn-primary btn-sm" style="float: right" href="{% url 'add-break' workday.pk %}"><i class="fas fa-plus"></i></a>
|
<a class="btn btn-primary btn-sm" style="float: right" href="{% url 'add-break' workday.pk %}"><i class="fas fa-plus"></i></a>
|
||||||
|
{% endif %}
|
||||||
</h5>
|
</h5>
|
||||||
<div col="col-10">
|
<div col="col-10">
|
||||||
<table class="table table-hover" >
|
<table class="table table-hover" >
|
||||||
|
|
@ -41,7 +45,11 @@
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
|
{% if team == 1 %}
|
||||||
<a class="btn" href="{% url 'tm-management' %} ">Abbrechen</a>
|
<a class="btn" href="{% url 'tm-management' %} ">Abbrechen</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="btn" href="{% url 'tm-team-single' user.pk workday.start.month workday.start.year %} ">Abbrechen</a>
|
||||||
|
{% endif %}
|
||||||
<button type="submit" class="btn btn-primary" style="float: right" id="addbreakbutton">Arbeitstag aktualisieren</button>
|
<button type="submit" class="btn btn-primary" style="float: right" id="addbreakbutton">Arbeitstag aktualisieren</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,24 @@
|
||||||
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, TimeUpdate, AddBreak, TimeAdd
|
from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate, TimeUpdate, AddBreak, TimeAdd, TimeManagementTeamSingle
|
||||||
'''
|
'''
|
||||||
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('tm/team/<int:pk>', TimeManagementTeamSingle, name='tm-team-single'),
|
||||||
|
path('tm/team/<int:pk>/<int:activemonth>/<int:activeyear>', TimeManagementTeamSingle, name='tm-team-single'),
|
||||||
path('<int:activemonth>/<int:activeyear>', TimeManagement, name='tm-management'),
|
path('<int:activemonth>/<int:activeyear>', TimeManagement, name='tm-management'),
|
||||||
path('update/<int:pk>', TimeUpdate, name='tm-update'),
|
path('update/<int:pk>', TimeUpdate, name='tm-update'),
|
||||||
|
path('update/<int:pk>/<int:team>', TimeUpdate, name='tm-update'),
|
||||||
path('add/', TimeAdd, name='tm-add'),
|
path('add/', TimeAdd, name='tm-add'),
|
||||||
|
path('add/<int:team>/<int:pk>', TimeAdd, name='tm-add'),
|
||||||
path('update/<int:pk>/addbreak/', AddBreak, name='add-break'),
|
path('update/<int:pk>/addbreak/', AddBreak, name='add-break'),
|
||||||
|
path('update/<int:pk>/addbreak/<int:team>', 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'),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,71 @@ def AbsenceManagmenet(request, activemonth=False, activeyear=False):
|
||||||
return render(request, 'timemanagement/tm_ab_management.html', context)
|
return render(request, 'timemanagement/tm_ab_management.html', context)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def TimeManagementTeamSingle(request, pk, activemonth=False, activeyear=False):
|
||||||
|
if(request.user.has_perm("users.usersmanager")):
|
||||||
|
# Setzt die Monatsausgabe auf Deutsch
|
||||||
|
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
|
||||||
|
user = User.objects.get(pk=pk)
|
||||||
|
# Hier wird der Monat und das Jahr für die Buttons gebaut
|
||||||
|
if(activemonth == False):
|
||||||
|
today = datetime.datetime.today()
|
||||||
|
active_month = str(today.strftime("%B"))
|
||||||
|
active_year = str(today.strftime("%Y"))
|
||||||
|
activemonth = today.month
|
||||||
|
else:
|
||||||
|
today = datetime.datetime(activeyear, activemonth, 1)
|
||||||
|
active_month = activemonth
|
||||||
|
active_month = str(today.strftime("%B"))
|
||||||
|
active_year = str(today.strftime("%Y"))
|
||||||
|
|
||||||
|
prev_year = active_year
|
||||||
|
next_year = active_year
|
||||||
|
|
||||||
|
next_month = today.month + 1
|
||||||
|
if(next_month == 13):
|
||||||
|
next_month = 1
|
||||||
|
next_year = int(next_year) + 1
|
||||||
|
|
||||||
|
prev_month = today.month - 1
|
||||||
|
if(prev_month == 0):
|
||||||
|
prev_month = 12
|
||||||
|
prev_year = int(prev_year) - 1
|
||||||
|
|
||||||
|
# Initialprüfung, ob Arbeitstage vorliegen
|
||||||
|
tempworkday = Workday.objects.filter(agency=request.user.profile.agency, user=user).order_by("start").exclude(end=None)[:1]
|
||||||
|
|
||||||
|
user_has_workdays = False
|
||||||
|
if len(tempworkday) == 1:
|
||||||
|
user_has_workdays = True
|
||||||
|
|
||||||
|
# Hier werden nur die Arbeitstage gefiltert, die auch aktuell zur Ansicht stehen sollen
|
||||||
|
context = {
|
||||||
|
"next_month" : next_month,
|
||||||
|
"breakmonthline" : date.today() - timedelta(days=30),
|
||||||
|
"prev_month" : prev_month,
|
||||||
|
"next_year" : next_year,
|
||||||
|
"prev_year" : prev_year,
|
||||||
|
"active_year" : int(active_year),
|
||||||
|
"active_month" : active_month,
|
||||||
|
"activemonth" : activemonth,
|
||||||
|
"active_link" : "timemanagement",
|
||||||
|
"days_this_month" : get_datetime_range(int(active_year), int(activemonth)),
|
||||||
|
"workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=user, start__month=activemonth, start__year=active_year).order_by("start").exclude(end=None),
|
||||||
|
"userhasworkdays" : user_has_workdays,
|
||||||
|
"user" : user
|
||||||
|
}
|
||||||
|
|
||||||
|
return render(request, 'timemanagement/timemanagement_teamview_single.html', context)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Requestet User has no rights...
|
||||||
|
else:
|
||||||
|
messages.success(request, f'Das würfen Sie nicht!')
|
||||||
|
return redirect("timemanagement")
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def TimeManagement(request, activemonth=False, activeyear=False):
|
def TimeManagement(request, activemonth=False, activeyear=False):
|
||||||
# Setzt die Monatsausgabe auf Deutsch
|
# Setzt die Monatsausgabe auf Deutsch
|
||||||
|
|
@ -344,10 +409,15 @@ def TimeManagement(request, activemonth=False, activeyear=False):
|
||||||
return render(request, 'timemanagement/timemanagement_management.html', context)
|
return render(request, 'timemanagement/timemanagement_management.html', context)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def TimeUpdate(request, pk):
|
def TimeUpdate(request, pk, team=0):
|
||||||
|
workday = Workday.objects.get(pk=pk)
|
||||||
|
user = workday.user
|
||||||
|
|
||||||
if(request.method == "POST"):
|
if(request.method == "POST"):
|
||||||
form = UpdateWorkdayForm(request.POST, instance=request.user)
|
if(team == 0):
|
||||||
workday = Workday.objects.get(pk=pk)
|
form = UpdateWorkdayForm(request.POST, instance=request.user)
|
||||||
|
else:
|
||||||
|
form = UpdateWorkdayForm(request.POST, instance=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])))
|
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])))
|
||||||
|
|
||||||
|
|
@ -358,74 +428,112 @@ def TimeUpdate(request, pk):
|
||||||
workday.target = form["target"].value()
|
workday.target = form["target"].value()
|
||||||
workday.save()
|
workday.save()
|
||||||
messages.success(request, f'Arbeitstag aktualisiert')
|
messages.success(request, f'Arbeitstag aktualisiert')
|
||||||
|
if(team == 1):
|
||||||
return redirect('tm-management')
|
return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year)
|
||||||
|
else:
|
||||||
|
return redirect('tm-management')
|
||||||
else:
|
else:
|
||||||
context = {
|
context = {
|
||||||
"active_link" : "timemanagement",
|
"active_link" : "timemanagement",
|
||||||
"workday" : Workday.objects.get(pk=pk),
|
"workday" : Workday.objects.get(pk=pk),
|
||||||
"form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk))
|
"form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk)),
|
||||||
|
"team" : team,
|
||||||
|
"user" : workday.user
|
||||||
}
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_update.html', context)
|
return render(request, 'timemanagement/timemanagement_update.html', context)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def TimeAdd(request):
|
def TimeAdd(request, team=0, pk=0):
|
||||||
if(request.method == "POST"):
|
if(team == 0):
|
||||||
|
user = request.user
|
||||||
form = AddWorkdayForm(request.POST, instance=request.user)
|
form = AddWorkdayForm(request.POST, instance=request.user)
|
||||||
|
else:
|
||||||
|
user = User.objects.get(pk=pk)
|
||||||
|
form = AddWorkdayForm(request.POST, instance=user)
|
||||||
|
|
||||||
|
if(request.method == "POST"):
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
#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])))
|
#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])))
|
#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 = Workday(start=form.cleaned_data["start"], end=form.cleaned_data["end"], target=form.cleaned_data["target"], user=request.user, agency=request.user.profile.agency)
|
workday = Workday(start=form.cleaned_data["start"], end=form.cleaned_data["end"], target=form.cleaned_data["target"], user=user, agency=request.user.profile.agency)
|
||||||
|
|
||||||
if workday.start.day != workday.end.day or workday.start.month != workday.end.month or workday.start.year != workday.end.year or workday.start > workday.end:
|
if workday.start.day != workday.end.day or workday.start.month != workday.end.month or workday.start.year != workday.end.year or workday.start > workday.end:
|
||||||
messages.success(request, f'Der Arbeitstag darf nur an einem Tag stattfinden und das Ende muss nach dem Anfang liegen.')
|
messages.success(request, f'Der Arbeitstag darf nur an einem Tag stattfinden und das Ende muss nach dem Anfang liegen.')
|
||||||
context = {
|
context = {
|
||||||
"active_link" : "timemanagement",
|
"active_link" : "timemanagement",
|
||||||
"form" : AddWorkdayForm()
|
"form" : AddWorkdayForm(),
|
||||||
|
"team" : team,
|
||||||
|
"user" : user
|
||||||
}
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_add.html', context)
|
return render(request, 'timemanagement/timemanagement_add.html', context)
|
||||||
else:
|
else:
|
||||||
workday.save()
|
workday.save()
|
||||||
messages.success(request, f'Arbeitstag hinzugefügt')
|
messages.success(request, f'Arbeitstag hinzugefügt')
|
||||||
return redirect('tm-management')
|
|
||||||
|
if (team == 1):
|
||||||
|
return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year)
|
||||||
|
else:
|
||||||
|
return redirect('tm-management')
|
||||||
else:
|
else:
|
||||||
messages.success(request, f'Bitte valide Daten eingeben!')
|
messages.success(request, f'Bitte valide Daten eingeben!')
|
||||||
context = {
|
context = {
|
||||||
"active_link" : "timemanagement",
|
"active_link" : "timemanagement",
|
||||||
"form" : AddWorkdayForm()
|
"form" : AddWorkdayForm(),
|
||||||
|
"team" : team,
|
||||||
|
"user" : user
|
||||||
}
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_add.html', context)
|
return render(request, 'timemanagement/timemanagement_add.html', context)
|
||||||
else:
|
else:
|
||||||
context = {
|
context = {
|
||||||
"active_link" : "timemanagement",
|
"active_link" : "timemanagement",
|
||||||
"form" : AddWorkdayForm()
|
"form" : AddWorkdayForm(),
|
||||||
}
|
"team" : team,
|
||||||
|
"user" : user
|
||||||
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_add.html', context)
|
return render(request, 'timemanagement/timemanagement_add.html', context)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def AddBreak(request, pk):
|
def AddBreak(request, pk, team=0):
|
||||||
|
workday = Workday.objects.get(pk=pk)
|
||||||
|
user = workday.user
|
||||||
if(request.method == "POST"):
|
if(request.method == "POST"):
|
||||||
workday = Workday.objects.get(pk=pk)
|
if(team == 0):
|
||||||
form = AddBreakForm(request.POST, instance=request.user)
|
form = AddBreakForm(request.POST, instance=request.user)
|
||||||
|
else:
|
||||||
|
form = AddBreakForm(request.POST, instance=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])))
|
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])))
|
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)
|
if(team == 0):
|
||||||
|
newbreak = Breaks.objects.create(workday=workday, user=request.user, agency=request.user.profile.agency, start=start, end=end)
|
||||||
|
else:
|
||||||
|
newbreak = Breaks.objects.create(workday=workday, user=user, agency=user.profile.agency, start=start, end=end)
|
||||||
|
|
||||||
workday.breaks.add(newbreak)
|
workday.breaks.add(newbreak)
|
||||||
workday.save()
|
workday.save()
|
||||||
messages.success(request, f'Pause hinzugefügt')
|
messages.success(request, f'Pause hinzugefügt')
|
||||||
return redirect('tm-update', pk=pk)
|
|
||||||
|
if(team == 0):
|
||||||
|
return redirect('tm-update', pk=pk)
|
||||||
|
else:
|
||||||
|
return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year)
|
||||||
else:
|
else:
|
||||||
context = {
|
if(team == 0):
|
||||||
"active_link" : "timemanagement",
|
context = {
|
||||||
"workday" : Workday.objects.get(pk=pk),
|
"active_link" : "timemanagement",
|
||||||
"form" : AddBreakForm(instance=request.user)
|
"workday" : Workday.objects.get(pk=pk),
|
||||||
}
|
"form" : AddBreakForm(instance=request.user)
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
context = {
|
||||||
|
"active_link" : "timemanagement",
|
||||||
|
"workday" : Workday.objects.get(pk=pk),
|
||||||
|
"form" : AddBreakForm(instance=user)
|
||||||
|
}
|
||||||
return render(request, 'timemanagement/timemanagement_break.html', context)
|
return render(request, 'timemanagement/timemanagement_break.html', context)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
|
@ -511,7 +619,7 @@ def TimeAjax(request):
|
||||||
# REMOVE WORKDAY
|
# REMOVE WORKDAY
|
||||||
elif request.GET["action"] == "remove_workday":
|
elif request.GET["action"] == "remove_workday":
|
||||||
wd = Workday.objects.get(pk=request.GET.get("workday"))
|
wd = Workday.objects.get(pk=request.GET.get("workday"))
|
||||||
if(wd.user == request.user and wd.agency == request.user.profile.agency):
|
if(wd.agency == request.user.profile.agency):
|
||||||
wd.delete()
|
wd.delete()
|
||||||
data = {
|
data = {
|
||||||
"success" : True
|
"success" : True
|
||||||
|
|
@ -521,7 +629,7 @@ def TimeAjax(request):
|
||||||
# REMOVE BREAK
|
# REMOVE BREAK
|
||||||
elif request.GET["action"] == "remove_break":
|
elif request.GET["action"] == "remove_break":
|
||||||
breakwd = Breaks.objects.get(pk=request.GET.get("break"))
|
breakwd = Breaks.objects.get(pk=request.GET.get("break"))
|
||||||
if(breakwd.user == request.user and breakwd.agency == request.user.profile.agency):
|
if(breakwd.agency == request.user.profile.agency):
|
||||||
breakwd.delete()
|
breakwd.delete()
|
||||||
data = {
|
data = {
|
||||||
"success" : True
|
"success" : True
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue