corrected total overtime calculation

This commit is contained in:
Jörg Henke
2024-01-04 10:01:58 +01:00
parent 48168aaf65
commit 742446e46e
7 changed files with 31 additions and 12 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;
/**

View File

@ -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<LocalTime> WORKTIME = DSL.field("worktime", LocalTime.class);
Field<LocalTime> BREAKTIME = DSL.field("breaktime", LocalTime.class);
SelectConditionStep<Record6<LocalTime, LocalTime, LocalTime, LocalTime, YearToSecond, LocalTime>> sql = jooq
SelectConditionStep<Record5<LocalTime, LocalTime, LocalTime, LocalTime, YearToSecond>> 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<LocalTime, LocalTime, LocalTime, LocalTime, YearToSecond, LocalTime> r = sql.fetchOne();
Record5<LocalTime, LocalTime, LocalTime, LocalTime, YearToSecond> 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();
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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