Compare commits

...

2 Commits

Author SHA1 Message Date
a52793de46 corrected date change 2024-01-05 21:26:53 +01:00
e38f62fa72 fixed overtime calculation 2024-01-05 21:18:32 +01:00
4 changed files with 171 additions and 121 deletions

View File

@ -7,7 +7,7 @@ plugins {
apply plugin: 'io.spring.dependency-management' apply plugin: 'io.spring.dependency-management'
group = 'de.jottyfan' group = 'de.jottyfan'
version = '1.4.5' version = '1.4.6'
description = """timetrack""" description = """timetrack"""

View File

@ -73,9 +73,7 @@ public class DoneController extends CommonController {
@RolesAllowed("timetrack_user") @RolesAllowed("timetrack_user")
@PostMapping("/done/list") @PostMapping("/done/list")
public String getListForDate(Model model, @ModelAttribute("day") LocalDate day) { public String getListForDate(Model model, @ModelAttribute("doneModel") DoneModel doneModel) {
DoneModel doneModel = new DoneModel();
doneModel.setDay(day);
return getList(model, doneModel); return getList(model, doneModel);
} }
@ -242,4 +240,20 @@ public class DoneController extends CommonController {
bean.getIncludeSaturday(), bean.getIncludeSunday()); bean.getIncludeSaturday(), bean.getIncludeSunday());
return "redirect:/done/list"; return "redirect:/done/list";
} }
@RolesAllowed("timetrack_user")
@GetMapping("/done/slot/back")
public String oneMonthBack(Model model, @ModelAttribute("doneModel") DoneModel doneModel) {
LocalDate day = doneModel.getDay();
doneModel.setDay(day.minusMonths(1));
return "redirect:/done/list";
}
@RolesAllowed("timetrack_user")
@GetMapping("/done/slot/forward")
public String oneMonthForward(Model model, @ModelAttribute("doneModel") DoneModel doneModel) {
LocalDate day = doneModel.getDay();
doneModel.setDay(day.plusMonths(1));
return "redirect:/done/list";
}
} }

View File

@ -95,12 +95,12 @@ public class DoneRepository {
Field<Integer> OVERTIME = DSL.field("overtime", Integer.class); Field<Integer> OVERTIME = DSL.field("overtime", Integer.class);
SelectHavingStep<Record1<Integer>> sql = jooq SelectHavingStep<Record1<Integer>> sql = jooq
// @formatter:off // @formatter:off
.select(T_OVERTIME.OVERTIME_MINUTES.plus(DSL.sum(DSL.extract(V_DAY.WORKTIME, DatePart.MINUTE).minus(T_REQUIRED_WORKTIME.REQUIRED_MINUTES))).as(OVERTIME)) .select(T_OVERTIME.OVERTIME_MINUTES.plus(DSL.sum(DSL.extract(V_DAY.WORKTIME, DatePart.EPOCH).div(60).minus(T_REQUIRED_WORKTIME.REQUIRED_MINUTES))).as(OVERTIME))
.from(V_DAY) .from(V_DAY)
.innerJoin(T_REQUIRED_WORKTIME).on(T_REQUIRED_WORKTIME.DAY.eq(V_DAY.DAY).and(T_REQUIRED_WORKTIME.FK_LOGIN.eq(V_DAY.FK_LOGIN))) .innerJoin(T_REQUIRED_WORKTIME).on(T_REQUIRED_WORKTIME.DAY.eq(V_DAY.DAY).and(T_REQUIRED_WORKTIME.FK_LOGIN.eq(V_DAY.FK_LOGIN)))
.innerJoin(T_OVERTIME).on(T_OVERTIME.FK_LOGIN.eq(V_DAY.FK_LOGIN)) .innerJoin(T_OVERTIME).on(T_OVERTIME.FK_LOGIN.eq(V_DAY.FK_LOGIN))
.innerJoin(T_LOGIN).on(T_LOGIN.PK.eq(V_DAY.FK_LOGIN)) .innerJoin(T_LOGIN).on(T_LOGIN.PK.eq(V_DAY.FK_LOGIN))
.where(T_OVERTIME.IMPACT.ge(V_DAY.DAY.cast(LocalDateTime.class))) .where(T_OVERTIME.IMPACT.le(V_DAY.DAY.cast(LocalDateTime.class)))
.and(V_DAY.DAY.le(day)) .and(V_DAY.DAY.le(day))
.and(T_LOGIN.LOGIN.eq(login)) .and(T_LOGIN.LOGIN.eq(login))
.groupBy(V_DAY.FK_LOGIN, T_OVERTIME.OVERTIME_MINUTES); .groupBy(V_DAY.FK_LOGIN, T_OVERTIME.OVERTIME_MINUTES);

View File

@ -1,6 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:sec="http://www.thymeleaf.org/extras/spring-security" layout:decorate="~{layout/main.html}">
xmlns:sec="http://www.thymeleaf.org/extras/spring-security" layout:decorate="~{layout/main.html}">
<head> <head>
<title>Arbeitszeit</title> <title>Arbeitszeit</title>
</head> </head>
@ -8,8 +7,10 @@
<font layout:fragment="title">Arbeitszeit</font> <font layout:fragment="title">Arbeitszeit</font>
<ul layout:fragment="menuitem"> <ul layout:fragment="menuitem">
<li class="nav-item" sec:authorize="hasRole('timetrack_user')"> <li class="nav-item" sec:authorize="hasRole('timetrack_user')">
<a class="nav-link btn btn-primary btn-white-text" th:href="@{/done/list/previousday}" style="width: 50px; float: left;"><i class="fa fa-chevron-left"></i></a> <a class="nav-link btn btn-primary btn-white-text" th:href="@{/done/list/previousday}" style="width: 50px; float: left;">
<form th:action="@{/done/list}" th:object="${doneModel}" method="post" style="float:left;"> <i class="fa fa-chevron-left"></i>
</a>
<form th:action="@{/done/list}" th:object="${doneModel}" method="post" style="float: left;">
<div class="nav-link" style="padding-top: 5px !important; padding-bottom: 0px !important"> <div class="nav-link" style="padding-top: 5px !important; padding-bottom: 0px !important">
<div class="input-group input-group-sm mb-3" style="margin-bottom: 0px !important"> <div class="input-group input-group-sm mb-3" style="margin-bottom: 0px !important">
<input type="date" class="form-control" th:value="*{day}" th:field="*{day}" /> <input type="date" class="form-control" th:value="*{day}" th:field="*{day}" />
@ -17,20 +18,19 @@
</div> </div>
</div> </div>
</form> </form>
<a class="nav-link btn btn-primary btn-white-text" th:href="@{/done/list/nextday}" style="width: 50px; float: left;"><i class="fa fa-chevron-right"></i></a> <a class="nav-link btn btn-primary btn-white-text" th:href="@{/done/list/nextday}" style="width: 50px; float: left;">
<i class="fa fa-chevron-right"></i>
</a>
</li> </li>
</ul> </ul>
<ul layout:fragment="menu"> <ul layout:fragment="menu">
<li class="nav-item" sec:authorize="hasRole('timetrack_user')"> <li class="nav-item" sec:authorize="hasRole('timetrack_user')">
<table> <table>
<tr> <tr>
<td><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/{day}(day=${doneModel.day})}">Neuer <td><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/{day}(day=${doneModel.day})}">Neuer Eintrag</a></td>
Eintrag</a></td>
<td> <td>
<div class="dropdown"> <div class="dropdown">
<button class="btn btn-white-text dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-white-text dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Letzte Einträge</button>
Letzte Einträge
</button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li th:each="recent : ${recentList}"> <li th:each="recent : ${recentList}">
<a class="dropdown-item" th:href="@{/done/addrecent/{id}(id=${recent.pk})}" <a class="dropdown-item" th:href="@{/done/addrecent/{id}(id=${recent.pk})}"
@ -39,21 +39,39 @@
</ul> </ul>
</div> </div>
</td> </td>
<td style="padding-left: 8px"><a class="nav-link btn-list" th:href="@{/done/list}"><i class="fas fa-sync"></i></a></td> <td style="padding-left: 8px"><a class="nav-link btn-list" th:href="@{/done/list}">
<i class="fas fa-sync"></i>
</a></td>
</tr> </tr>
</table> </table>
</li> </li>
</ul> </ul>
<main layout:fragment="content"> <main layout:fragment="content">
<ul class="nav nav-tabs navback" role="tablist"> <ul class="nav nav-tabs navback" role="tablist">
<li class="nav-item"><a class="nav-link navlinkstyle active" data-bs-toggle="tab" href="#div_list">Liste</a></li> <li class="nav-item">
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_schedule">Kalender</a></li> <a class="nav-link navlinkstyle active" data-bs-toggle="tab" href="#div_list">Liste</a>
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_project">Projekt</a></li> </li>
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_module">Modul</a></li> <li class="nav-item">
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_job">Aufgabe</a></li> <a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_schedule">Kalender</a>
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_billing">Abrechnung</a></li> </li>
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_overtime">Überstunden</a></li> <li class="nav-item">
<li class="nav-item"><a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_slot">Slots</a></li> <a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_project">Projekt</a>
</li>
<li class="nav-item">
<a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_module">Modul</a>
</li>
<li class="nav-item">
<a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_job">Aufgabe</a>
</li>
<li class="nav-item">
<a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_billing">Abrechnung</a>
</li>
<li class="nav-item">
<a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_overtime">Überstunden</a>
</li>
<li class="nav-item">
<a class="nav-link navlinkstyle" data-bs-toggle="tab" href="#div_slot">Slots</a>
</li>
</ul> </ul>
<div class="tabdivblurred tab-content"> <div class="tabdivblurred tab-content">
<div id="div_list" class="tab-pane active tab-pane-table"> <div id="div_list" class="tab-pane active tab-pane-table">
@ -71,7 +89,9 @@
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Favoriten</button> <button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">Favoriten</button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li th:each="f : ${favorites}"> <li th:each="f : ${favorites}">
<a class="dropdown-item" th:href="@{/done/usefav/{id}(id=${f.fkFavorite})}"><span th:text="${f.project} + ' ' + ${f.module} + ' ' + ${f.job}"></span></a> <a class="dropdown-item" th:href="@{/done/usefav/{id}(id=${f.fkFavorite})}">
<span th:text="${f.project} + ' ' + ${f.module} + ' ' + ${f.job}"></span>
</a>
</li> </li>
</ul> </ul>
</div> </div>
@ -80,24 +100,33 @@
</thead> </thead>
<tbody> <tbody>
<tr th:each="done : ${doneList}"> <tr th:each="done : ${doneList}">
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span th:text="${done.timeNote}"></span></a> <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}">
<a th:if="${done.timeUntil == null}" style="margin-left: 4px" class="btn-list" th:href="@{/done/end/{id}(id=${done.pk})}" title="aktuelle Uhrzeit setzen"><i class="fa fa-clock"></i></a> <span th:text="${done.timeNote}"></span>
</td> </a> <a th:if="${done.timeUntil == null}" style="margin-left: 4px" class="btn-list" th:href="@{/done/end/{id}(id=${done.pk})}" title="aktuelle Uhrzeit setzen">
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span th:text="${done.timeDiff}"></span></a></td> <i class="fa fa-clock"></i>
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" </a></td>
th:text="${done.project?.name}"></span></a></td> <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}">
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" <span th:text="${done.timeDiff}"></span>
th:text="${done.module?.name}"></span></a></td> </a></td>
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}">
th:text="${done.activity?.name}"></span></a></td> <span class="boldtext" th:text="${done.project?.name}"></span>
<td><span th:text="${done.billing.shortcut}" th:class="'billing ' + ${done.billing.csskey}" </a></td>
th:if="${done.billing != null}"></span></td> <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}">
<td> <span class="boldtext" th:text="${done.module?.name}"></span>
<a class="btn-list" th:href="@{/done/copy/{id}(id=${done.pk})}" title="Aufgabe neu beginnen"><i class="fa fa-copy"></i></a> </a></td>
<a class="btn-list" th:href="@{/done/edit/{id}(id=${done.pk})}" title="Eintrag bearbeiten"><i class="fa fa-edit"></i></a> <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}">
<a class="btn-list" th:href="@{/done/favorize/{id}(id=${done.pk})}" title="als Favorit speichern" th:if="${!done.isFavorite}"><i class="far fa-star golden"></i></a> <span class="boldtext" th:text="${done.activity?.name}"></span>
<a class="btn-list" th:href="@{/done/unfavorize/{id}(id=${done.pk})}" title="Favoritenstatus entfernen" th:if="${done.isFavorite}"><i class="fas fa-star golden"></i></a> </a></td>
</td> <td><span th:text="${done.billing.shortcut}" th:class="'billing ' + ${done.billing.csskey}" th:if="${done.billing != null}"></span></td>
<td><a class="btn-list" th:href="@{/done/copy/{id}(id=${done.pk})}" title="Aufgabe neu beginnen">
<i class="fa fa-copy"></i>
</a> <a class="btn-list" th:href="@{/done/edit/{id}(id=${done.pk})}" title="Eintrag bearbeiten">
<i class="fa fa-edit"></i>
</a> <a class="btn-list" th:href="@{/done/favorize/{id}(id=${done.pk})}" title="als Favorit speichern" th:if="${!done.isFavorite}">
<i class="far fa-star golden"></i>
</a> <a class="btn-list" th:href="@{/done/unfavorize/{id}(id=${done.pk})}" title="Favoritenstatus entfernen" th:if="${done.isFavorite}">
<i class="fas fa-star golden"></i>
</a></td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
@ -111,14 +140,10 @@
</tr> </tr>
<tr> <tr>
<td></td> <td></td>
<td><span th:if="${sum.getBillingTime('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span <td><span th:if="${sum.getBillingTime('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span th:text="${sum.getBillingTime('WP2')}" class="distfat"></span></span></td>
th:text="${sum.getBillingTime('WP2')}" class="distfat"></span></span></td> <td><span th:if="${sum.getBillingTime('WP4') != '0,0 h'}"><span class="billing WP4">WP4</span><span th:text="${sum.getBillingTime('WP4')}" class="distfat"></span></span></td>
<td><span th:if="${sum.getBillingTime('WP4') != '0,0 h'}"><span class="billing WP4">WP4</span><span <td><span th:if="${sum.getBillingTime('WP5') != '0,0 h'}"><span class="billing WP5">WP5</span><span th:text="${sum.getBillingTime('WP5')}" class="distfat"></span></span></td>
th:text="${sum.getBillingTime('WP4')}" class="distfat"></span></span></td> <td><span th:if="${sum.getBillingTime('TA3') != '0,0 h'}"><span class="billing TA3">TA3</span><span th:text="${sum.getBillingTime('TA3')}" class="distfat"></span></span></td>
<td><span th:if="${sum.getBillingTime('WP5') != '0,0 h'}"><span class="billing WP5">WP5</span><span
th:text="${sum.getBillingTime('WP5')}" class="distfat"></span></span></td>
<td><span th:if="${sum.getBillingTime('TA3') != '0,0 h'}"><span class="billing TA3">TA3</span><span
th:text="${sum.getBillingTime('TA3')}" class="distfat"></span></span></td>
<td colspan="2"><span class="billing">X</span><span th:text="${sum.getBillingTime(null)}" class="distfat"></span></td> <td colspan="2"><span class="billing">X</span><span th:text="${sum.getBillingTime(null)}" class="distfat"></span></td>
</tr> </tr>
</tfoot> </tfoot>
@ -140,13 +165,14 @@
<tr th:each="project : ${projectList}"> <tr th:each="project : ${projectList}">
<td><span th:text="${project.name}"></span></td> <td><span th:text="${project.name}"></span></td>
<td><span th:text="${project.percentUsage}"></span></td> <td><span th:text="${project.percentUsage}"></span></td>
<td><a th:href="@{/done/edit/project/{id}(id=${project.pk})}" th:title="${project.pk}"><i class="fa fa-edit"></i></a></td> <td><a th:href="@{/done/edit/project/{id}(id=${project.pk})}" th:title="${project.pk}">
<i class="fa fa-edit"></i>
</a></td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a> <td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a></td>
</td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@ -164,7 +190,9 @@
<tr th:each="module : ${moduleList}"> <tr th:each="module : ${moduleList}">
<td><span th:text="${module.name}"></span></td> <td><span th:text="${module.name}"></span></td>
<td><span th:text="${module.percentUsage}"></span></td> <td><span th:text="${module.percentUsage}"></span></td>
<td><a th:href="@{/done/edit/module/{id}(id=${module.pk})}" th:title="${module.pk}"><i class="fa fa-edit"></i></a></td> <td><a th:href="@{/done/edit/module/{id}(id=${module.pk})}" th:title="${module.pk}">
<i class="fa fa-edit"></i>
</a></td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
@ -187,7 +215,9 @@
<tr th:each="job : ${jobList}"> <tr th:each="job : ${jobList}">
<td><span th:text="${job.name}"></span></td> <td><span th:text="${job.name}"></span></td>
<td><span th:text="${job.percentUsage}"></span></td> <td><span th:text="${job.percentUsage}"></span></td>
<td><a th:href="@{/done/edit/job/{id}(id=${job.pk})}" th:title="${job.pk}"><i class="fa fa-edit"></i></a></td> <td><a th:href="@{/done/edit/job/{id}(id=${job.pk})}" th:title="${job.pk}">
<i class="fa fa-edit"></i>
</a></td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
@ -242,9 +272,8 @@
</div> </div>
<div id="div_slot" class="tab-pane fade tab-pane-table"> <div id="div_slot" class="tab-pane fade tab-pane-table">
<div class="alert alert-info"> <div class="alert alert-info">
Zur Berechnung der täglichen Überstunden müssen Slots angelegt werden, die definieren, an welchen Tagen wieviele Stunden zu arbeiten ist. Zur Berechnung der täglichen Überstunden müssen Slots angelegt werden, die definieren, an welchen Tagen wieviele Stunden zu arbeiten ist. Die Überstundenberechnung hängt von der
Die Überstundenberechnung hängt von der Vollständigkeit der vorhandenen Slots ab; fehlen Slots, wird die Arbeitszeit jener Tage nicht eingerechnet.<br /> Vollständigkeit der vorhandenen Slots ab; fehlen Slots, wird die Arbeitszeit jener Tage nicht eingerechnet.<br /> Hier werden nur die Slots für diesen Monat angezeigt.
Hier werden nur die Slots für diesen Monat angezeigt.
</div> </div>
<div class="container"> <div class="container">
<div class="row row-weekday"> <div class="row row-weekday">
@ -259,21 +288,24 @@
<div class="row row-weekday"> <div class="row row-weekday">
<div class="col slot_badge" th:each="o : ${slotOffset}"></div> <div class="col slot_badge" th:each="o : ${slotOffset}"></div>
<div class="col slot_badge" th:each="s : ${slots}"> <div class="col slot_badge" th:each="s : ${slots}">
<span class="slot_badge_left" th:text="${#temporals.format(s.day, 'dd.MM.')}"> <span class="slot_badge_left" th:text="${#temporals.format(s.day, 'dd.MM.')}"> </span>
</span><a th:href="@{/done/slot/{id}(id=${s.id})}" class="slot_badge_middle" th:if="${s.id}"> <a th:href="@{/done/slot/{id}(id=${s.id})}" class="slot_badge_middle" th:if="${s.id}">
<i class="fas fa-pencil"></i> <i class="fas fa-pencil"></i>
</a><a th:href="@{/done/slot/add?day={d}(d=${s.day})}" class="slot_badge_middle" th:unless="${s.id}"> </a>
<a th:href="@{/done/slot/add?day={d}(d=${s.day})}" class="slot_badge_middle" th:unless="${s.id}">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> </a>
<span class="slot_badge_middle slot_reason" th:if="${s.reason}" th:text="${s.reason}"></span><span th:class="${s.reason != null ? 'slot_badge_right' : 'slot_badge_right boldy'}" th:text="${s.printTime()}" th:if="${s.id}"></span><span <span class="slot_badge_middle slot_reason" th:if="${s.reason}" th:text="${s.reason}"></span><span th:class="${s.reason != null ? 'slot_badge_right' : 'slot_badge_right boldy'}"
class="slot_badge_right" th:unless="${s.id}">&nbsp;--:--&nbsp;</span> th:text="${s.printTime()}" th:if="${s.id}"></span><span class="slot_badge_right" th:unless="${s.id}">&nbsp;--:--&nbsp;</span>
</div> </div>
</div> </div>
<br /> <br />
<div class="row"> <div class="row">
<div class="col"> <div class="col-2"><a th:href="@{/done/slot/back}" class="btn btn-outline-primary">&lt;- zurück</a></div>
<div class="col-8">
<a th:href="@{/done/slot/range}" class="btn btn-outline-primary">mehrere Slots auf einmal anlegen</a> <a th:href="@{/done/slot/range}" class="btn btn-outline-primary">mehrere Slots auf einmal anlegen</a>
</div> </div>
<div class="col-2"><a th:href="@{/done/slot/forward}" class="btn btn-outline-primary">weiter -&gt;</a></div>
</div> </div>
<br /> <br />
<div class="row alert alert-info"> <div class="row alert alert-info">
@ -281,30 +313,32 @@
<span style="text-decoration: underline">Legende</span> <span style="text-decoration: underline">Legende</span>
</div> </div>
<div class="col"> <div class="col">
Üb: Überstunden, Mehrarbeit<br /> Üb: Überstunden, Mehrarbeit<br /> Ur: Urlaub, Sonderurlaub, Kur<br /> gF: gesetzlicher Feiertag<br />
Ur: Urlaub, Sonderurlaub, Kur<br />
gF: gesetzlicher Feiertag<br />
</div> </div>
<div class="col"> <div class="col">
Kr: Arbeits- und Dienstunfähigkeit<br /> Kr: Arbeits- und Dienstunfähigkeit<br /> Gl: Freistellung aus Gleitzeitguthaben<br /> Ar: Arbeits- und Dienstbefreiung<br />
Gl: Freistellung aus Gleitzeitguthaben<br />
Ar: Arbeits- und Dienstbefreiung<br />
</div> </div>
<div class="col"> <div class="col">
mK: "mit Kind krank"<br /> mK: "mit Kind krank"<br /> Di: Dienstreise, Dienstgänge<br />
Di: Dienstreise, Dienstgänge<br />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function() { $(document)
let width = parseInt($("#schedule").css("min-width")); .ready(
let height = parseInt($("#schedule").css("min-height")); function() {
var schedule = new Schedule("#schedule", width, height); let width = parseInt($("#schedule").css(
var ctx = $("#scheduleCanvas")[0].getContext("2d"); "min-width"));
var currentDayRecords = JSON.parse('[(${schedule})]'); let height = parseInt($("#schedule").css(
"min-height"));
var schedule = new Schedule("#schedule", width,
height);
var ctx = $("#scheduleCanvas")[0]
.getContext("2d");
var currentDayRecords = JSON
.parse('[(${schedule})]');
var scheduleRecords = currentDayRecords.schedule; var scheduleRecords = currentDayRecords.schedule;
for (var i = 0; i < scheduleRecords.length; i++) { for (var i = 0; i < scheduleRecords.length; i++) {
var r = scheduleRecords[i]; var r = scheduleRecords[i];
@ -320,7 +354,9 @@
color = "#00aa00"; color = "#00aa00";
} }
/* daySlot 7 = sunday, but this should be slot 0 */ /* daySlot 7 = sunday, but this should be slot 0 */
schedule.drawSlot(ctx, r.daySlot > 6 ? 0 : r.daySlot, r.from, r.until, "black", color); schedule.drawSlot(ctx, r.daySlot > 6 ? 0
: r.daySlot, r.from, r.until,
"black", color);
} }
var localeUrl = '[[@{/js/dataTables/de.json}]]'; var localeUrl = '[[@{/js/dataTables/de.json}]]';
$("#project_table").DataTable({ $("#project_table").DataTable({