diff --git a/build.gradle b/build.gradle
index 1d3b705..349a773 100644
--- a/build.gradle
+++ b/build.gradle
@@ -23,7 +23,7 @@ apply plugin: 'maven-publish'
apply plugin: 'eclipse'
group = 'de.jottyfan'
-version = '20240103b'
+version = '20240103c'
def artifactId = 'timetrackjooq'
def versionNumber = version
diff --git a/src/main/java/de/jottyfan/timetrack/db/done/Done.java b/src/main/java/de/jottyfan/timetrack/db/done/Done.java
index 44a4363..3d20e5c 100644
--- a/src/main/java/de/jottyfan/timetrack/db/done/Done.java
+++ b/src/main/java/de/jottyfan/timetrack/db/done/Done.java
@@ -16,6 +16,7 @@ import de.jottyfan.timetrack.db.done.tables.TProject;
import de.jottyfan.timetrack.db.done.tables.TRequiredWorktime;
import de.jottyfan.timetrack.db.done.tables.VBilling;
import de.jottyfan.timetrack.db.done.tables.VCurrentOvertime;
+import de.jottyfan.timetrack.db.done.tables.VDay;
import de.jottyfan.timetrack.db.done.tables.VDaylimit;
import de.jottyfan.timetrack.db.done.tables.VDaylimits;
import de.jottyfan.timetrack.db.done.tables.VDone;
@@ -105,6 +106,11 @@ public class Done extends SchemaImpl {
*/
public final VCurrentOvertime V_CURRENT_OVERTIME = VCurrentOvertime.V_CURRENT_OVERTIME;
+ /**
+ * The table done.v_day
.
+ */
+ public final VDay V_DAY = VDay.V_DAY;
+
/**
* The table done.v_daylimit
.
*/
@@ -192,6 +198,7 @@ public class Done extends SchemaImpl {
TRequiredWorktime.T_REQUIRED_WORKTIME,
VBilling.V_BILLING,
VCurrentOvertime.V_CURRENT_OVERTIME,
+ VDay.V_DAY,
VDaylimit.V_DAYLIMIT,
VDaylimits.V_DAYLIMITS,
VDone.V_DONE,
diff --git a/src/main/java/de/jottyfan/timetrack/db/done/Tables.java b/src/main/java/de/jottyfan/timetrack/db/done/Tables.java
index e974296..085c82a 100644
--- a/src/main/java/de/jottyfan/timetrack/db/done/Tables.java
+++ b/src/main/java/de/jottyfan/timetrack/db/done/Tables.java
@@ -15,6 +15,7 @@ import de.jottyfan.timetrack.db.done.tables.TProject;
import de.jottyfan.timetrack.db.done.tables.TRequiredWorktime;
import de.jottyfan.timetrack.db.done.tables.VBilling;
import de.jottyfan.timetrack.db.done.tables.VCurrentOvertime;
+import de.jottyfan.timetrack.db.done.tables.VDay;
import de.jottyfan.timetrack.db.done.tables.VDaylimit;
import de.jottyfan.timetrack.db.done.tables.VDaylimits;
import de.jottyfan.timetrack.db.done.tables.VDone;
@@ -90,6 +91,11 @@ public class Tables {
*/
public static final VCurrentOvertime V_CURRENT_OVERTIME = VCurrentOvertime.V_CURRENT_OVERTIME;
+ /**
+ * The table done.v_day
.
+ */
+ public static final VDay V_DAY = VDay.V_DAY;
+
/**
* The table done.v_daylimit
.
*/
diff --git a/src/main/java/de/jottyfan/timetrack/db/done/tables/VDay.java b/src/main/java/de/jottyfan/timetrack/db/done/tables/VDay.java
new file mode 100644
index 0000000..2ab4579
--- /dev/null
+++ b/src/main/java/de/jottyfan/timetrack/db/done/tables/VDay.java
@@ -0,0 +1,177 @@
+/*
+ * This file is generated by jOOQ.
+ */
+package de.jottyfan.timetrack.db.done.tables;
+
+
+import de.jottyfan.timetrack.db.done.Done;
+import de.jottyfan.timetrack.db.done.tables.records.VDayRecord;
+
+import java.time.LocalDate;
+import java.util.function.Function;
+
+import org.jooq.Field;
+import org.jooq.ForeignKey;
+import org.jooq.Function5;
+import org.jooq.Name;
+import org.jooq.Record;
+import org.jooq.Records;
+import org.jooq.Row5;
+import org.jooq.Schema;
+import org.jooq.SelectField;
+import org.jooq.Table;
+import org.jooq.TableField;
+import org.jooq.TableOptions;
+import org.jooq.impl.DSL;
+import org.jooq.impl.SQLDataType;
+import org.jooq.impl.TableImpl;
+import org.jooq.types.YearToSecond;
+
+
+/**
+ * This class is generated by jOOQ.
+ */
+@SuppressWarnings({ "all", "unchecked", "rawtypes" })
+public class VDay extends TableImpl {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * The reference instance of done.v_day
+ */
+ public static final VDay V_DAY = new VDay();
+
+ /**
+ * The class holding records for this type
+ */
+ @Override
+ public Class getRecordType() {
+ return VDayRecord.class;
+ }
+
+ /**
+ * The column done.v_day.day
.
+ */
+ public final TableField DAY = createField(DSL.name("day"), SQLDataType.LOCALDATE, this, "");
+
+ /**
+ * The column done.v_day.worktime
.
+ */
+ public final TableField WORKTIME = createField(DSL.name("worktime"), SQLDataType.INTERVAL, this, "");
+
+ /**
+ * The column done.v_day.breaktime
.
+ */
+ public final TableField BREAKTIME = createField(DSL.name("breaktime"), SQLDataType.INTERVAL, this, "");
+
+ /**
+ * The column done.v_day.day_overtime
.
+ */
+ public final TableField DAY_OVERTIME = createField(DSL.name("day_overtime"), SQLDataType.INTERVAL, this, "");
+
+ /**
+ * The column done.v_day.fk_login
.
+ */
+ public final TableField FK_LOGIN = createField(DSL.name("fk_login"), SQLDataType.INTEGER, this, "");
+
+ private VDay(Name alias, Table aliased) {
+ this(alias, aliased, null);
+ }
+
+ private VDay(Name alias, Table aliased, Field>[] parameters) {
+ super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.view());
+ }
+
+ /**
+ * Create an aliased done.v_day
table reference
+ */
+ public VDay(String alias) {
+ this(DSL.name(alias), V_DAY);
+ }
+
+ /**
+ * Create an aliased done.v_day
table reference
+ */
+ public VDay(Name alias) {
+ this(alias, V_DAY);
+ }
+
+ /**
+ * Create a done.v_day
table reference
+ */
+ public VDay() {
+ this(DSL.name("v_day"), null);
+ }
+
+ public VDay(Table child, ForeignKey key) {
+ super(child, key, V_DAY);
+ }
+
+ @Override
+ public Schema getSchema() {
+ return aliased() ? null : Done.DONE;
+ }
+
+ @Override
+ public VDay as(String alias) {
+ return new VDay(DSL.name(alias), this);
+ }
+
+ @Override
+ public VDay as(Name alias) {
+ return new VDay(alias, this);
+ }
+
+ @Override
+ public VDay as(Table> alias) {
+ return new VDay(alias.getQualifiedName(), this);
+ }
+
+ /**
+ * Rename this table
+ */
+ @Override
+ public VDay rename(String name) {
+ return new VDay(DSL.name(name), null);
+ }
+
+ /**
+ * Rename this table
+ */
+ @Override
+ public VDay rename(Name name) {
+ return new VDay(name, null);
+ }
+
+ /**
+ * Rename this table
+ */
+ @Override
+ public VDay rename(Table> name) {
+ return new VDay(name.getQualifiedName(), null);
+ }
+
+ // -------------------------------------------------------------------------
+ // Row5 type methods
+ // -------------------------------------------------------------------------
+
+ @Override
+ public Row5 fieldsRow() {
+ return (Row5) super.fieldsRow();
+ }
+
+ /**
+ * Convenience mapping calling {@link SelectField#convertFrom(Function)}.
+ */
+ public SelectField mapping(Function5 super LocalDate, ? super YearToSecond, ? super YearToSecond, ? super YearToSecond, ? super Integer, ? extends U> from) {
+ return convertFrom(Records.mapping(from));
+ }
+
+ /**
+ * Convenience mapping calling {@link SelectField#convertFrom(Class,
+ * Function)}.
+ */
+ public SelectField mapping(Class toType, Function5 super LocalDate, ? super YearToSecond, ? super YearToSecond, ? super YearToSecond, ? super Integer, ? extends U> from) {
+ return convertFrom(toType, Records.mapping(from));
+ }
+}
diff --git a/src/main/java/de/jottyfan/timetrack/db/done/tables/records/VDayRecord.java b/src/main/java/de/jottyfan/timetrack/db/done/tables/records/VDayRecord.java
new file mode 100644
index 0000000..b4e825b
--- /dev/null
+++ b/src/main/java/de/jottyfan/timetrack/db/done/tables/records/VDayRecord.java
@@ -0,0 +1,249 @@
+/*
+ * This file is generated by jOOQ.
+ */
+package de.jottyfan.timetrack.db.done.tables.records;
+
+
+import de.jottyfan.timetrack.db.done.tables.VDay;
+
+import java.time.LocalDate;
+
+import org.jooq.Field;
+import org.jooq.Record5;
+import org.jooq.Row5;
+import org.jooq.impl.TableRecordImpl;
+import org.jooq.types.YearToSecond;
+
+
+/**
+ * This class is generated by jOOQ.
+ */
+@SuppressWarnings({ "all", "unchecked", "rawtypes" })
+public class VDayRecord extends TableRecordImpl implements Record5 {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Setter for done.v_day.day
.
+ */
+ public void setDay(LocalDate value) {
+ set(0, value);
+ }
+
+ /**
+ * Getter for done.v_day.day
.
+ */
+ public LocalDate getDay() {
+ return (LocalDate) get(0);
+ }
+
+ /**
+ * Setter for done.v_day.worktime
.
+ */
+ public void setWorktime(YearToSecond value) {
+ set(1, value);
+ }
+
+ /**
+ * Getter for done.v_day.worktime
.
+ */
+ public YearToSecond getWorktime() {
+ return (YearToSecond) get(1);
+ }
+
+ /**
+ * Setter for done.v_day.breaktime
.
+ */
+ public void setBreaktime(YearToSecond value) {
+ set(2, value);
+ }
+
+ /**
+ * Getter for done.v_day.breaktime
.
+ */
+ public YearToSecond getBreaktime() {
+ return (YearToSecond) get(2);
+ }
+
+ /**
+ * Setter for done.v_day.day_overtime
.
+ */
+ public void setDayOvertime(YearToSecond value) {
+ set(3, value);
+ }
+
+ /**
+ * Getter for done.v_day.day_overtime
.
+ */
+ public YearToSecond getDayOvertime() {
+ return (YearToSecond) get(3);
+ }
+
+ /**
+ * Setter for done.v_day.fk_login
.
+ */
+ public void setFkLogin(Integer value) {
+ set(4, value);
+ }
+
+ /**
+ * Getter for done.v_day.fk_login
.
+ */
+ public Integer getFkLogin() {
+ return (Integer) get(4);
+ }
+
+ // -------------------------------------------------------------------------
+ // Record5 type implementation
+ // -------------------------------------------------------------------------
+
+ @Override
+ public Row5 fieldsRow() {
+ return (Row5) super.fieldsRow();
+ }
+
+ @Override
+ public Row5 valuesRow() {
+ return (Row5) super.valuesRow();
+ }
+
+ @Override
+ public Field field1() {
+ return VDay.V_DAY.DAY;
+ }
+
+ @Override
+ public Field field2() {
+ return VDay.V_DAY.WORKTIME;
+ }
+
+ @Override
+ public Field field3() {
+ return VDay.V_DAY.BREAKTIME;
+ }
+
+ @Override
+ public Field field4() {
+ return VDay.V_DAY.DAY_OVERTIME;
+ }
+
+ @Override
+ public Field field5() {
+ return VDay.V_DAY.FK_LOGIN;
+ }
+
+ @Override
+ public LocalDate component1() {
+ return getDay();
+ }
+
+ @Override
+ public YearToSecond component2() {
+ return getWorktime();
+ }
+
+ @Override
+ public YearToSecond component3() {
+ return getBreaktime();
+ }
+
+ @Override
+ public YearToSecond component4() {
+ return getDayOvertime();
+ }
+
+ @Override
+ public Integer component5() {
+ return getFkLogin();
+ }
+
+ @Override
+ public LocalDate value1() {
+ return getDay();
+ }
+
+ @Override
+ public YearToSecond value2() {
+ return getWorktime();
+ }
+
+ @Override
+ public YearToSecond value3() {
+ return getBreaktime();
+ }
+
+ @Override
+ public YearToSecond value4() {
+ return getDayOvertime();
+ }
+
+ @Override
+ public Integer value5() {
+ return getFkLogin();
+ }
+
+ @Override
+ public VDayRecord value1(LocalDate value) {
+ setDay(value);
+ return this;
+ }
+
+ @Override
+ public VDayRecord value2(YearToSecond value) {
+ setWorktime(value);
+ return this;
+ }
+
+ @Override
+ public VDayRecord value3(YearToSecond value) {
+ setBreaktime(value);
+ return this;
+ }
+
+ @Override
+ public VDayRecord value4(YearToSecond value) {
+ setDayOvertime(value);
+ return this;
+ }
+
+ @Override
+ public VDayRecord value5(Integer value) {
+ setFkLogin(value);
+ return this;
+ }
+
+ @Override
+ public VDayRecord values(LocalDate value1, YearToSecond value2, YearToSecond value3, YearToSecond value4, Integer value5) {
+ value1(value1);
+ value2(value2);
+ value3(value3);
+ value4(value4);
+ value5(value5);
+ return this;
+ }
+
+ // -------------------------------------------------------------------------
+ // Constructors
+ // -------------------------------------------------------------------------
+
+ /**
+ * Create a detached VDayRecord
+ */
+ public VDayRecord() {
+ super(VDay.V_DAY);
+ }
+
+ /**
+ * Create a detached, initialised VDayRecord
+ */
+ public VDayRecord(LocalDate day, YearToSecond worktime, YearToSecond breaktime, YearToSecond dayOvertime, Integer fkLogin) {
+ super(VDay.V_DAY);
+
+ setDay(day);
+ setWorktime(worktime);
+ setBreaktime(breaktime);
+ setDayOvertime(dayOvertime);
+ setFkLogin(fkLogin);
+ resetChangedOnNotNull();
+ }
+}
diff --git a/src/main/resources/done_ext.sql b/src/main/resources/done_ext.sql
index 3e20a74..e25216c 100644
--- a/src/main/resources/done_ext.sql
+++ b/src/main/resources/done_ext.sql
@@ -65,4 +65,18 @@ group by x.worktime_offset, x.fk_login;
grant select on done.v_current_overtime to timetrack;
-create view done.v_version as select 20240103 as version;
+create view done.v_day as
+with x(dayworktime, day, fk_login, required, starttime, endtime) as (
+ select sum(d.dayworktime), d.day, d.fk_login, r.required,
+ min(d.daytime_from), max(d.daytime_until)
+ from done.v_daylimit d
+ left join done.t_required_worktime r on r.day = d.day and r.fk_login = d.fk_login
+ group by d.day, d.fk_login, r.required
+) select day, dayworktime as worktime, endtime - starttime - dayworktime as breaktime,
+ dayworktime - required as day_overtime, fk_login
+ from x
+ order by day desc, fk_login;
+
+grant select on done.v_day to timetrack;
+
+create or replace view done.v_version as select 20240103 as version;