147 lines
7.8 KiB
Twig
147 lines
7.8 KiB
Twig
{% extends 'admin/layout.html.twig' %}
|
||
|
||
{% block title %}Arbeitszeiten{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="flex items-start justify-between pb-4">
|
||
<h1 class="text-2xl font-bold">
|
||
Arbeitszeiten
|
||
</h1>
|
||
<div class="flex flex-col items-end space-y-2 md:flex-row md:items-center md:space-x-2 md:space-y-0">
|
||
<button type="button"
|
||
class="{{ html_classes('btn btn--small', { 'btn--secondary': filterDto.active }) }}"
|
||
title="Arbeitszeiten filtern"
|
||
hx-get="{{ path('app_common_work_month_filter', { 'r': return_url() }) }}"
|
||
hx-target="body"
|
||
hx-swap="beforeend">
|
||
{{ icon('filter', 'w-4 h-4 shrink-0') }}
|
||
{% if filterDto.active %}
|
||
<span class="whitespace-nowrap">{{ filterDto.activeFiltersCount }} Filter aktiv</span>
|
||
{% else %}
|
||
<span>Filter</span>
|
||
{% endif %}
|
||
</button>
|
||
{% if filterDto.active %}
|
||
<a href="{{ path('app_common_work_month_filter_reset', { 'r': return_url() }) }}" class="btn btn--small btn--secondary">
|
||
Reset
|
||
</a>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
|
||
<div class="data-table-wrapper">
|
||
<div class="data-table-wrapper__inner">
|
||
<table class="data-table">
|
||
<thead>
|
||
<tr>
|
||
<th>{{ knp_pagination_sortable(pagination, 'Name', 'teamer.lastName') }}</th>
|
||
<th>Vorname</th>
|
||
<th>{{ knp_pagination_sortable(pagination, 'Monat', 'work_month.year') }}</th>
|
||
<th class="text-right">Stunden</th>
|
||
<th>Status</th>
|
||
<th>Nachweis</th>
|
||
<th></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for workMonth in pagination %}
|
||
<tr>
|
||
<td>
|
||
<a href="{{ path('app_administrative_teamer_profile', { 'uuid': workMonth.teamer.uuid, 'r': return_url() }) }}">
|
||
<span class="whitespace-nowrap">{{ workMonth.teamer.lastName }}</span>
|
||
</a>
|
||
</td>
|
||
<td>
|
||
<span class="whitespace-nowrap">{{ workMonth.teamer.firstName }}</span>
|
||
</td>
|
||
<td>
|
||
<span class="whitespace-nowrap">{{ workMonth.periodLabel }}</span>
|
||
</td>
|
||
<td class="text-right">
|
||
<span class="whitespace-nowrap">{{ workMonth.totalMinutes|duration_hm }}</span>
|
||
{% if workMonth.hasMismatch %}
|
||
<div class="text-xs text-red-600 whitespace-nowrap"
|
||
title="Die SaaS meldet inzwischen andere Stunden für diesen bereits eingereichten Monat.">
|
||
jetzt {{ workMonth.mismatchTotalMinutes|duration_hm }}
|
||
</div>
|
||
{% endif %}
|
||
{% if workMonth.warnings is not empty %}
|
||
<div class="text-xs text-amber-700 whitespace-nowrap"
|
||
title="{{ workMonth.warnings|join(' | ') }}">
|
||
{{ workMonth.warnings|length }} Hinweis(e)
|
||
</div>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
<span class="upload-status-badge {{ workMonth.status.badgeClass }}">
|
||
{{ workMonth.status.label }}
|
||
</span>
|
||
</td>
|
||
<td>
|
||
{% if workMonth.currentDocument %}
|
||
<a href="{{ path('app_common_download', { 'uuid': workMonth.currentDocument.uuid }) }}"
|
||
class="flex items-center space-x-1">
|
||
{{ icon('download', 'w-4 h-4 shrink-0') }}
|
||
<span class="whitespace-nowrap">{{ workMonth.submittedAt|date('d.m.Y') }}</span>
|
||
</a>
|
||
{% else %}
|
||
<span class="text-gray-400">–</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
<twig:DropDown>
|
||
<a href="{{ path('app_admin_work_month_pdf', { 'uuid': workMonth.uuid }) }}"
|
||
class="text-gray-700 hover:text-primary block px-4 py-2 text-sm"
|
||
role="menuitem"
|
||
tabindex="-1"
|
||
target="_blank">
|
||
Nachweis ansehen
|
||
</a>
|
||
{% if workMonth.status.value == 'submitted' %}
|
||
<a href="{{ path('app_admin_work_month_review', { 'uuid': workMonth.uuid, 'r': return_url() }) }}"
|
||
class="text-gray-700 hover:text-primary block px-4 py-2 text-sm"
|
||
role="menuitem"
|
||
tabindex="-1"
|
||
hx-get="{{ path('app_admin_work_month_review', { 'uuid': workMonth.uuid, 'r': return_url() }) }}"
|
||
hx-target="body"
|
||
hx-swap="beforeend">
|
||
Prüfen
|
||
</a>
|
||
{% endif %}
|
||
<form method="post" action="{{ path('app_admin_work_month_sync', { 'uuid': workMonth.uuid, 'r': return_url() }) }}">
|
||
<button type="submit"
|
||
class="w-full text-left text-gray-700 hover:text-primary block px-4 py-2 text-sm"
|
||
role="menuitem"
|
||
tabindex="-1">
|
||
Erneut abrufen
|
||
</button>
|
||
</form>
|
||
{% if workMonth.status.value in ['submitted', 'approved'] %}
|
||
<form method="post" action="{{ path('app_admin_work_month_unlock', { 'uuid': workMonth.uuid, 'r': return_url() }) }}">
|
||
<button type="submit"
|
||
class="w-full text-left text-gray-700 hover:text-primary block px-4 py-2 text-sm"
|
||
role="menuitem"
|
||
tabindex="-1"
|
||
onclick="return confirm('Der Monat wird wieder geöffnet und muss neu unterschrieben werden. Fortfahren?')">
|
||
Wieder öffnen
|
||
</button>
|
||
</form>
|
||
{% endif %}
|
||
</twig:DropDown>
|
||
</td>
|
||
</tr>
|
||
{% else %}
|
||
<tr>
|
||
<td colspan="7" class="text-gray-500">
|
||
Keine Arbeitszeiten gefunden.
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
{{ knp_pagination_render(pagination) }}
|
||
{% endblock %}
|