diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java b/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java index cf8cecf..d5f62c3 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/DoneBean.java @@ -124,10 +124,14 @@ public class DoneBean implements Serializable, Comparable { return buf.toString(); } - public String getTimeDiff() { + public Duration getTimeDiffDuration() { LocalDateTime earlier = timeFrom != null ? timeFrom : LocalDateTime.now(); LocalDateTime later = timeUntil != null ? timeUntil : LocalDateTime.now(); - Duration diff = Duration.between(earlier, later); + return Duration.between(earlier, later); + } + + public String getTimeDiff() { + Duration diff = getTimeDiffDuration(); return String.format("%02d:%02d", diff.toHours(), diff.toMinutes() % 60); } diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java index 11d8a11..215d870 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/DoneController.java @@ -1,5 +1,6 @@ package de.jottyfan.timetrack.spring.done; +import java.time.Duration; import java.util.List; import javax.annotation.security.RolesAllowed; @@ -39,10 +40,11 @@ public class DoneController { @RequestMapping(value = "/done/list") public String getList(@ModelAttribute DoneModel doneModel, Model model) { String username = doneService.getCurrentUser(request); + Duration maxWorkTime = Duration.ofHours(8); // TODO: to the configuration file List list = doneService.getList(doneModel.getDay(), username); model.addAttribute("doneList", list); model.addAttribute("doneModel", doneModel); - model.addAttribute("sum", new SummaryBean(list)); + model.addAttribute("sum", new SummaryBean(list, doneModel.getDay(), maxWorkTime)); model.addAttribute("projectList", doneService.getProjects()); model.addAttribute("moduleList", doneService.getModules()); model.addAttribute("jobList", doneService.getJobs()); diff --git a/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java b/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java index 8acd44e..88c8dc7 100644 --- a/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java +++ b/src/main/java/de/jottyfan/timetrack/spring/done/SummaryBean.java @@ -1,6 +1,7 @@ package de.jottyfan.timetrack.spring.done; import java.io.Serializable; +import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -13,37 +14,82 @@ import java.util.List; public class SummaryBean implements Serializable { private static final long serialVersionUID = 1L; + private final Duration maxDayWorktime; + private final LocalDate day; private final List list; - - public SummaryBean(List list) { + + public SummaryBean(List list, LocalDate day, Duration maxDayWorktime) { this.list = list; + this.day = day; + this.maxDayWorktime = maxDayWorktime; } /** * @return the start */ - public String getStart() { - LocalDateTime found = LocalDate.now().atTime(23, 59); + private LocalDateTime getStartTime() { + LocalDateTime found = day.atTime(23, 59); for (DoneBean bean : list) { LocalDateTime ldt = bean.getTimeFrom(); if (ldt != null && ldt.isBefore(found)) { found = ldt; } } - return String.format("%02d:%02d", found.getHour(), found.getMinute() % 60); + return found; } /** * @return the end */ - public String getEnd() { - LocalDateTime found = LocalDate.now().atTime(0, 0); + private LocalDateTime getEndTime() { + LocalDateTime found = day.atTime(0, 0); for (DoneBean bean : list) { LocalDateTime ldt = bean.getTimeUntil(); - if (ldt != null && found.isBefore(ldt)) { + if (ldt != null && ldt.isAfter(found)) { found = ldt; } } + return found; + } + + /** + * get sum of break times + * + * @return the sum of the break times; 0 at least + */ + private Duration getBreakTime() { + LocalDateTime startTime = getStartTime(); + LocalDateTime endTime = getEndTime(); + Duration totalTime = getTotalTime(); + Duration dayTime = Duration.between(startTime, endTime); + return dayTime.minus(totalTime); + } + + /** + * @return total time of the day as the summary of all work times of the day + */ + private Duration getTotalTime() { + Duration duration = Duration.ZERO; + for (DoneBean bean : list) { + Duration current = bean.getTimeDiffDuration(); + duration = duration.plus(current); + } + return duration; + } + + /** + * @return the start time as formatted string + */ + public String getStart() { + LocalDateTime found = getStartTime(); + return String.format("%02d:%02d", found.getHour(), found.getMinute() % 60); + } + + /** + * @return the end time as formatted string + */ + public String getEnd() { + LocalDateTime found = getEndTime(); return String.format("%02d:%02d", found.getHour(), found.getMinute() % 60); } @@ -51,20 +97,27 @@ public class SummaryBean implements Serializable { * @return the total */ public String getTotal() { - return "TODO"; + Duration total = getTotalTime(); + return String.format("%02d:%02d", total.toHours(), total.toMinutesPart()); } /** * @return the pause */ public String getPause() { - return "TODO"; + Duration breakTime = getBreakTime(); + Long hours = breakTime.toHours(); + Integer minutes = breakTime.toMinutesPart(); + hours = hours < 0 ? 0 : hours; + minutes = minutes < 0 ? 0 : minutes; + return String.format("%02d:%02d", hours, minutes); } /** * @return the overdue */ public String getOverdue() { - return "TODO"; + Duration overdue = getTotalTime().minus(maxDayWorktime); + return String.format("%02d:%02d", overdue.toHours(), overdue.toMinutesPart()); } } diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html index 4914829..17c3658 100644 --- a/src/main/resources/templates/error.html +++ b/src/main/resources/templates/error.html @@ -10,7 +10,8 @@