diff --git a/src/main/java/de/jottyfan/timetrack/modules/IndexController.java b/src/main/java/de/jottyfan/timetrack/modules/IndexController.java index c7c4f1a..d9ec5d9 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/IndexController.java +++ b/src/main/java/de/jottyfan/timetrack/modules/IndexController.java @@ -15,8 +15,8 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import de.jottyfan.timetrack.component.OAuth2Provider; -import de.jottyfan.timetrack.modules.done.DoneBean; import de.jottyfan.timetrack.modules.done.DoneService; +import de.jottyfan.timetrack.modules.done.model.DoneBean; import de.jottyfan.timetrack.modules.done.model.DoneModel; import de.jottyfan.timetrack.modules.done.model.SummaryBean; import de.jottyfan.timetrack.modules.profile.ProfileService; diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/DoneController.java b/src/main/java/de/jottyfan/timetrack/modules/done/DoneController.java index 136dd24..782ac7e 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/DoneController.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/DoneController.java @@ -11,6 +11,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import de.jottyfan.timetrack.component.OAuth2Provider; import de.jottyfan.timetrack.modules.CommonController; +import de.jottyfan.timetrack.modules.done.model.DoneBean; import de.jottyfan.timetrack.modules.done.model.DoneModel; import de.jottyfan.timetrack.modules.done.model.SummaryBean; import de.jottyfan.timetrack.modules.profile.ProfileService; diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/DoneGateway.java b/src/main/java/de/jottyfan/timetrack/modules/done/DoneGateway.java index c70b19c..e64ca25 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/DoneGateway.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/DoneGateway.java @@ -45,6 +45,7 @@ import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; import de.jottyfan.timetrack.db.done.tables.records.VProjectRecord; import de.jottyfan.timetrack.db.profile.tables.records.TLoginRecord; import de.jottyfan.timetrack.help.LocalDateHelper; +import de.jottyfan.timetrack.modules.done.model.DoneBean; import de.jottyfan.timetrack.modules.done.model.FavoriteBean; /** diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/DoneRepository.java b/src/main/java/de/jottyfan/timetrack/modules/done/DoneRepository.java index 71a7e2b..90a2f0e 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/DoneRepository.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/DoneRepository.java @@ -1,18 +1,19 @@ package de.jottyfan.timetrack.modules.done; -import static de.jottyfan.timetrack.db.done.Tables.V_CURRENT_OVERTIME; import static de.jottyfan.timetrack.db.done.Tables.V_DAY; import static de.jottyfan.timetrack.db.profile.Tables.T_LOGIN; +import java.sql.Time; import java.time.Duration; import java.time.LocalDate; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jooq.DSLContext; import org.jooq.Field; -import org.jooq.Record6; +import org.jooq.Record5; import org.jooq.SelectConditionStep; import org.jooq.impl.DSL; import org.jooq.types.YearToSecond; @@ -37,22 +38,20 @@ public class DoneRepository { Field WORKTIME = DSL.field("worktime", LocalTime.class); Field BREAKTIME = DSL.field("breaktime", LocalTime.class); - SelectConditionStep> sql = jooq + SelectConditionStep> sql = jooq // @formatter:off .select(V_DAY.STARTTIME, V_DAY.ENDTIME, V_DAY.WORKTIME.cast(LocalTime.class).as(WORKTIME), V_DAY.BREAKTIME.cast(LocalTime.class).as(BREAKTIME), - V_DAY.DAY_OVERTIME, - V_CURRENT_OVERTIME.OVERTIME.plus(DSL.coalesce(V_DAY.DAY_OVERTIME, YearToSecond.valueOf(0))).as(V_CURRENT_OVERTIME.OVERTIME)) + V_DAY.DAY_OVERTIME) .from(V_DAY) .innerJoin(T_LOGIN).on(T_LOGIN.PK.eq(V_DAY.FK_LOGIN)) - .leftJoin(V_CURRENT_OVERTIME).on(V_CURRENT_OVERTIME.FK_LOGIN.eq(V_DAY.FK_LOGIN)) .where(V_DAY.DAY.eq(day)) .and(T_LOGIN.LOGIN.eq(login)); // @formatter:on LOGGER.trace(sql); - Record6 r = sql.fetchOne(); + Record5 r = sql.fetchOne(); if (r == null) { return null; } else { @@ -65,8 +64,27 @@ public class DoneRepository { Duration dayOvertimeDuration = dayOvertime == null ? null : dayOvertime.toDuration(); String dayOvertimeString = dayOvertimeDuration == null ? null : String.format("%3d:%2d", dayOvertimeDuration.toHours(), Math.abs(dayOvertimeDuration.toMinutes() % 60)); bean.setDayOvertime(dayOvertimeString == null ? "?" : dayOvertimeString); - bean.setTotalOvertime(r.get(V_CURRENT_OVERTIME.OVERTIME)); + bean.setTotalOvertime(getOvertimeOf(day, login)); return bean; } } + + private LocalTime getOvertimeOf(LocalDate day, String login) { + // using sql string here, because the DSL.sum function does not allow LocalTime, whilst the postgreSQL sum function does allow time calculations + String sqlRaw = """ + select o.worktime_offset + sum(d.worktime - r.required) as overtime + from done.v_day d + inner join done.t_required_worktime r on r.day = d.day and r.fk_login = d.fk_login + inner join done.t_overtime o on o.fk_login = d.fk_login + inner join profile.t_login p on p.pk = d.fk_login + where o.impact < d.day + and d.day <= '?' + and p.login = '?' + group by d.fk_login, o.worktime_offset; + """; + String sql = sqlRaw.replaceFirst("\\?", day.format(DateTimeFormatter.ISO_DATE)).replaceFirst("\\?", login); + LOGGER.trace(sql); + Time time = (Time) jooq.fetchOne(sql).get(0); + return time.toLocalTime(); + } } diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/DoneService.java b/src/main/java/de/jottyfan/timetrack/modules/done/DoneService.java index e1e4c4a..45f7d1c 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/DoneService.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/DoneService.java @@ -20,6 +20,7 @@ import de.jottyfan.timetrack.db.done.tables.records.VJobRecord; import de.jottyfan.timetrack.db.done.tables.records.VModuleRecord; import de.jottyfan.timetrack.db.done.tables.records.VProjectRecord; import de.jottyfan.timetrack.modules.done.model.DaysumBean; +import de.jottyfan.timetrack.modules.done.model.DoneBean; import de.jottyfan.timetrack.modules.done.model.FavoriteBean; import de.jottyfan.timetrack.modules.note.NoteService; diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/DoneBean.java b/src/main/java/de/jottyfan/timetrack/modules/done/model/DoneBean.java similarity index 99% rename from src/main/java/de/jottyfan/timetrack/modules/done/DoneBean.java rename to src/main/java/de/jottyfan/timetrack/modules/done/model/DoneBean.java index 491fe6c..fc45144 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/DoneBean.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/model/DoneBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.timetrack.modules.done; +package de.jottyfan.timetrack.modules.done.model; import java.io.Serializable; import java.time.Duration; diff --git a/src/main/java/de/jottyfan/timetrack/modules/done/model/SummaryBean.java b/src/main/java/de/jottyfan/timetrack/modules/done/model/SummaryBean.java index 2ad80d2..f7ad6cf 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/done/model/SummaryBean.java +++ b/src/main/java/de/jottyfan/timetrack/modules/done/model/SummaryBean.java @@ -6,8 +6,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; -import de.jottyfan.timetrack.modules.done.DoneBean; - /** * * @author henkej