corrected total overtime calculation
This commit is contained in:
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
@ -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
|
||||
|
Reference in New Issue
Block a user