From 50229d95f28f226c4db387d953446eb203fa992f Mon Sep 17 00:00:00 2001 From: Robert Vokac Date: Sat, 18 May 2024 17:08:39 +0200 Subject: [PATCH] Added new features related to the pause --- .../utils/timecalc/entity/WorkingDay.java | 2 + .../timecalc/entity/WorkingDayForStats.java | 18 ++++- .../WorkingDayRepositorySQLiteImpl.java | 11 ++- .../impl/sqlite/WorkingDayTable.java | 2 + .../swing/common/TimeCalcKeyAdapter.java | 4 +- .../timecalc/swing/windows/MainWindow.java | 68 +++++++++++++++---- .../swing/windows/WorkingDaysWindow.java | 13 +++- ...ause_start_hour_and_pause_start_minute.sql | 2 + 8 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 modules/time-calc-app/src/main/resources/db_migrations/sqlite/timecalc/V000008__alter_table_working_day_add_columns_pause_start_hour_and_pause_start_minute.sql diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDay.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDay.java index 30d184c..e02a613 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDay.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDay.java @@ -36,6 +36,8 @@ public class WorkingDay { private int arrivalMinute; private int overtimeHour; private int overtimeMinute; + private int pauseStartHour; + private int pauseStartMinute; private int workingTimeInMinutes; private int pauseTimeInMinutes; diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java index 9a9b4d5..edae572 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java @@ -22,6 +22,8 @@ public class WorkingDayForStats extends WorkingDay { private int departureHour; private int departureMinute; + private int pauseEndHour; + private int pauseEndMinute; private int dayOfWeek; private int remainingOvertimeHours; private int remainingOvertimeMinutes; @@ -207,6 +209,8 @@ public class WorkingDayForStats extends WorkingDay { wd.getArrivalMinute(), wd.getOvertimeHour(), wd.getOvertimeMinute(), + wd.getPauseStartHour(), + wd.getPauseStartMinute(), wd.getWorkingTimeInMinutes(), wd.getPauseTimeInMinutes(), wd.getNote(), @@ -216,10 +220,11 @@ public class WorkingDayForStats extends WorkingDay { public WorkingDayForStats(String id, int year, int month, int day, int arrivalHour, int arrivalMinute, int overtimeHour, - int overtimeMinute, int workingTimeInMinutes, + int overtimeMinute, int pauseStartHour, int pauseStartMinute, + int workingTimeInMinutes, int pauseTimeInMinutes, String note, boolean timeOff, int forgetOvertime) { super(id, year, month, day, arrivalHour, arrivalMinute, overtimeHour, - overtimeMinute, workingTimeInMinutes, pauseTimeInMinutes, note, + overtimeMinute, pauseStartHour, pauseStartMinute, workingTimeInMinutes, pauseTimeInMinutes, note, timeOff, forgetOvertime); this.arrival = this.isThisDayTimeOff() ? null : new TTime(arrivalHour, arrivalMinute); @@ -234,6 +239,15 @@ public class WorkingDayForStats extends WorkingDay { this.departureHour = this.isThisDayTimeOff() ? -1 : departure.getHour(); this.departureMinute = this.isThisDayTimeOff() ? -1 : departure.getMinute(); + TTime pauseStart = new TTime(this.getPauseStartHour(), this.getPauseStartMinute()); + TTime pauseEnd = null; + if(pause == null) { + pauseEnd = pauseStart.cloneInstance(); + } else { + pauseEnd = pauseStart.add(pause); + } + this.pauseEndHour = pauseEnd.getHour(); + this.pauseEndMinute = pauseEnd.getMinute(); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month - 1); diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayRepositorySQLiteImpl.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayRepositorySQLiteImpl.java index d91396b..63eea53 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayRepositorySQLiteImpl.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayRepositorySQLiteImpl.java @@ -36,7 +36,7 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi { sb .append("INSERT INTO ") .append(WorkingDayTable.TABLE_NAME) - .append(" VALUES (?,?,?,?, ?,?,?,?, ?,?,?,?,?)"); + .append(" VALUES (?,?,?,?, ?,?,?,?, ?,?,?,?,?, ?,?)"); String sql = sb.toString(); @@ -53,6 +53,8 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi { stmt.setInt(++i, workingDay.getArrivalMinute()); stmt.setInt(++i, workingDay.getOvertimeHour()); stmt.setInt(++i, workingDay.getOvertimeMinute()); + stmt.setInt(++i, workingDay.getPauseStartHour()); + stmt.setInt(++i, workingDay.getPauseStartMinute()); // stmt.setInt(++i, workingDay.getWorkingTimeInMinutes()); stmt.setInt(++i, workingDay.getPauseTimeInMinutes()); @@ -153,6 +155,8 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi { .append(WorkingDayTable.ARRIVAL_MINUTE).append("=?, ") .append(WorkingDayTable.OVERTIME_HOUR).append("=?, ") .append(WorkingDayTable.OVERTIME_MINUTE).append("=?, ") + .append(WorkingDayTable.PAUSE_START_HOUR).append("=?, ") + .append(WorkingDayTable.PAUSE_START_MINUTE).append("=?, ") .append(WorkingDayTable.WORKING_TIME_IN_MINUTES).append("=?, ") .append(WorkingDayTable.PAUSE_TIME_IN_MINUTES).append("=?, ") .append(WorkingDayTable.NOTE).append("=?, ") @@ -170,6 +174,9 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi { stmt.setInt(++i, workingDay.getArrivalMinute()); stmt.setInt(++i, workingDay.getOvertimeHour()); stmt.setInt(++i, workingDay.getOvertimeMinute()); + stmt.setInt(++i, workingDay.getPauseStartHour()); + stmt.setInt(++i, workingDay.getPauseStartMinute()); + // stmt.setInt(++i, workingDay.getWorkingTimeInMinutes()); stmt.setInt(++i, workingDay.getPauseTimeInMinutes()); stmt.setString(++i, workingDay.getNote()); @@ -205,6 +212,8 @@ public class WorkingDayRepositorySQLiteImpl implements WorkingDayRepositoryApi { rs.getInt(WorkingDayTable.ARRIVAL_MINUTE), rs.getInt(WorkingDayTable.OVERTIME_HOUR), rs.getInt(WorkingDayTable.OVERTIME_MINUTE), + rs.getInt(WorkingDayTable.PAUSE_START_HOUR), + rs.getInt(WorkingDayTable.PAUSE_START_MINUTE), rs.getInt(WorkingDayTable.WORKING_TIME_IN_MINUTES), rs.getInt(WorkingDayTable.PAUSE_TIME_IN_MINUTES), rs.getString(WorkingDayTable.NOTE), diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayTable.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayTable.java index 6704447..778a1e3 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayTable.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/persistence/impl/sqlite/WorkingDayTable.java @@ -35,6 +35,8 @@ public class WorkingDayTable { public static final String ARRIVAL_MINUTE = "ARRIVAL_MINUTE"; public static final String OVERTIME_HOUR = "OVERTIME_HOUR"; public static final String OVERTIME_MINUTE = "OVERTIME_MINUTE"; + public static final String PAUSE_START_HOUR = "PAUSE_START_HOUR"; + public static final String PAUSE_START_MINUTE = "PAUSE_START_MINUTE"; public static final String WORKING_TIME_IN_MINUTES = "WORKING_TIME_IN_MINUTES"; public static final String PAUSE_TIME_IN_MINUTES = "PAUSE_TIME_IN_MINUTES"; public static final String NOTE = "NOTE"; diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/TimeCalcKeyAdapter.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/TimeCalcKeyAdapter.java index 73561ce..8b5c2ee 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/TimeCalcKeyAdapter.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/TimeCalcKeyAdapter.java @@ -256,10 +256,10 @@ public class TimeCalcKeyAdapter extends KeyAdapter { break; } if (increase) { - mainWindow.increasePause(changeTTime); + mainWindow.increasePauseLength(changeTTime); } if (decrease) { - mainWindow.decreasePause(changeTTime); + mainWindow.decreasePauseLength(changeTTime); } break; } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java index ece025a..db46296 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/MainWindow.java @@ -115,6 +115,7 @@ public class MainWindow extends TWindow { private final TTextField overtimeTextField; private final TTextField workingTimeTextField; private final TTextField pauseTimeTextField; + private final TTextField pauseStartTextField; private final TTextField noteTextField; private final TCheckBox timeOffCheckBox = new TCheckBox("Time off"); private final TTextField departureTextField; @@ -155,6 +156,7 @@ public class MainWindow extends TWindow { this.overtimeTextField = new TTextField(Constants.DEFAULT_OVERTIME, 50, true, valueMustBeTime); this.workingTimeTextField = new TTextField("08:00", 50, true, valueMustBeTime); this.pauseTimeTextField = new TTextField("00:30", 50, true, valueMustBeTime); + this.pauseStartTextField = new TTextField("11:00", 50, true, valueMustBeTime); this.noteTextField = new TTextField("", 60); this.departureTextField = new TTextField(); @@ -569,21 +571,42 @@ public class MainWindow extends TWindow { workingDecreaseButton.setBounds(workingTimeTextField.getX() + workingTimeTextField.getWidth(), workingTimeTextField.getY() + 15, 15, 15); // - TLabel pauseTimeInMinutesFieldLabel = new TLabel("Pause:", 40); - pauseTimeInMinutesFieldLabel.setBoundsFromLeft(workingTimeTextField, 15); + TLabel pauseLenghtTimeInMinutesFieldLabel = new TLabel("Pause length:", 80); + pauseLenghtTimeInMinutesFieldLabel.setBoundsFromLeft(workingTimeTextField, 15); - pauseTimeTextField.setBoundsFromLeft(pauseTimeInMinutesFieldLabel); + pauseTimeTextField.setBoundsFromLeft(pauseLenghtTimeInMinutesFieldLabel); TButton pauseIncreaseButton = new SmallTButton('+'); TButton pauseDecreaseButton = new SmallTButton('-'); pauseIncreaseButton.setBounds(pauseTimeTextField.getX() + pauseTimeTextField.getWidth(), pauseTimeTextField.getY(), 15, 15); pauseDecreaseButton.setBounds(pauseTimeTextField.getX() + pauseTimeTextField.getWidth(), pauseTimeTextField.getY() + 15, 15, 15); // - TLabel noteTextFieldLabel = new TLabel("Note:", 40); - noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField, 10); + TLabel pauseStartTimeLabel = new TLabel("Pause start:", 60); + pauseStartTimeLabel.setBoundsFromLeft(pauseIncreaseButton, 15); + + pauseStartTextField.setBoundsFromLeft(pauseStartTimeLabel); + TButton pauseStartIncreaseButton = new SmallTButton('+'); + TButton pauseStartDecreaseButton = new SmallTButton('-'); + pauseStartIncreaseButton.setBounds(pauseStartTextField.getX() + pauseStartTextField.getWidth(), pauseStartTextField.getY(), 15, 15); + pauseStartDecreaseButton.setBounds(pauseStartTextField.getX() + pauseStartTextField.getWidth(), pauseStartTextField.getY() + 15, 15, 15); + + + + + // + TLabel noteTextFieldLabel = new TLabel("Note:", 80); + noteTextFieldLabel.setBoundsFromTop(arrivalTextFieldLabel); noteTextField.setBoundsFromLeft(noteTextFieldLabel); timeOffCheckBox.setBoundsFromLeft(noteTextField); + + this.saveButton = new TButton("Save", 180); + saveButton.setBounds( + pauseDecreaseButton.getX() - SwingUtils.MARGIN, + timeOffCheckBox.getY(), + noteTextField.getWidth() * 3, + noteTextField.getHeight() + ); // if(!allowOnlyBasicFeaturesProperty.getValue()) add(arrivalTextFieldLabel); @@ -602,10 +625,14 @@ public class MainWindow extends TWindow { add(workingDecreaseButton); if(!allowOnlyBasicFeaturesProperty.getValue()) { - add(pauseTimeInMinutesFieldLabel); + add(pauseLenghtTimeInMinutesFieldLabel); add(pauseTimeTextField); add(pauseIncreaseButton); add(pauseDecreaseButton); + add(pauseStartTimeLabel); + add(pauseStartTextField); + add(pauseStartIncreaseButton); + add(pauseStartDecreaseButton); } arrivalIncreaseButton.addActionListener(e -> increaseArrival(TTime.T_TIME_ONE_MINUTE)); @@ -614,15 +641,17 @@ public class MainWindow extends TWindow { overtimeDecreaseButton.addActionListener(e -> decreaseOvertime(TTime.T_TIME_ONE_MINUTE)); workingIncreaseButton.addActionListener(e -> increaseWork(TTime.T_TIME_ONE_MINUTE)); workingDecreaseButton.addActionListener(e -> decreaseWork(TTime.T_TIME_ONE_MINUTE)); - pauseIncreaseButton.addActionListener(e -> increasePause(TTime.T_TIME_ONE_MINUTE)); - pauseDecreaseButton.addActionListener(e -> decreasePause(TTime.T_TIME_ONE_MINUTE)); + pauseIncreaseButton.addActionListener(e -> increasePauseLength(TTime.T_TIME_ONE_MINUTE)); + pauseDecreaseButton.addActionListener(e -> decreasePauseLength(TTime.T_TIME_ONE_MINUTE)); + pauseStartIncreaseButton.addActionListener(e -> increasePauseStart(TTime.T_TIME_ONE_MINUTE)); + pauseStartDecreaseButton.addActionListener(e -> decreasePauseStart(TTime.T_TIME_ONE_MINUTE)); if(!allowOnlyBasicFeaturesProperty.getValue()) add(noteTextFieldLabel); add(noteTextField); add(timeOffCheckBox); // TLabel departureTextFieldLabel = new TLabel("Departure:", 70); - departureTextFieldLabel.setBoundsFromTop(arrivalTextFieldLabel); + departureTextFieldLabel.setBoundsFromTop(noteTextFieldLabel); departureTextField.setBoundsFromLeft(departureTextFieldLabel); departureTextField.setEditable(false); @@ -638,8 +667,6 @@ public class MainWindow extends TWindow { remainingTextField.setBoundsFromLeft(remainingTextFieldLabel); remainingTextField.setEditable(false); - this.saveButton = new TButton("Save", 180); - saveButton.setBoundsFromLeft(remainingTextField); // if(!allowOnlyBasicFeaturesProperty.getValue()) add(departureTextFieldLabel); @@ -901,6 +928,7 @@ public class MainWindow extends TWindow { TTime overtime_ = new TTime(overtimeTextField.getText()); TTime work_ = new TTime(workingTimeTextField.getText()); TTime pause_ = new TTime(pauseTimeTextField.getText()); + TTime pauseStart = new TTime(pauseStartTextField.getText()); Calendar cal = time.asCalendar(); int year = cal.get(Calendar.YEAR); @@ -922,6 +950,8 @@ public class MainWindow extends TWindow { workingDay.setOvertimeMinute(overtime_.getMinute() * (overtime_.isNegative() ? (-1) : 1)); workingDay.setWorkingTimeInMinutes(work_.toTotalMilliseconds() / 1000 / 60); workingDay.setPauseTimeInMinutes(pause_.toTotalMilliseconds() / 1000 / 60); + workingDay.setPauseStartHour(pauseStart.getHour()); + workingDay.setPauseStartMinute(pauseStart.getMinute()); workingDay.setNote(noteTextField.getText()); workingDay.setTimeOff(timeOffCheckBox.isSelected()); workingDay.setForgetOvertime(forgetOvertimeProperty.getValue()); @@ -941,6 +971,7 @@ public class MainWindow extends TWindow { // workingTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getWorkingTimeInMinutes() * 60 * 1000).toString().substring(0, 5)); pauseTimeTextField.valueProperty.setValue(TTime.ofMilliseconds(wd.getPauseTimeInMinutes() * 60 * 1000).toString().substring(0, 5)); + pauseStartTextField.valueProperty.setValue(new TTime(wd.getPauseStartHour(), wd.getPauseStartMinute()).toString().substring(0,5)); noteTextField.valueProperty.setValue(wd.getNote()); timeOffCheckBox.setSelected(wd.isTimeOff()); forgetOvertimeProperty.setValue(wd.getForgetOvertime()); @@ -1630,16 +1661,27 @@ public class MainWindow extends TWindow { workingTimeTextField.valueProperty.setValue(new TTime(this.workingTimeTextField.valueProperty.getValue()).remove(tTime).toString().substring(0, 5)); } - public void increasePause(TTime tTime) { + public void increasePauseLength(TTime tTime) { pauseTimeTextField.valueProperty.setValue(new TTime(this.pauseTimeTextField.valueProperty.getValue()).add(tTime).toString().substring(0, 5)); } - public void decreasePause(TTime tTime) { + public void decreasePauseLength(TTime tTime) { pauseTimeTextField.valueProperty.setValue( new TTime(this.pauseTimeTextField.valueProperty.getValue()) .remove(tTime).toString().substring(0, 5)); } + public void increasePauseStart(TTime tTime) { + pauseStartTextField.valueProperty.setValue(new TTime(this.pauseStartTextField.valueProperty.getValue()).add(tTime).toString().substring(0, 5)); + } + + public void decreasePauseStart(TTime tTime) { + pauseStartTextField.valueProperty.setValue( + new TTime(this.pauseStartTextField.valueProperty.getValue()) + .remove(tTime).toString().substring(0, 5)); + } + + public void doSaveButtonClick() { this.saveButton.doClick(); } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/WorkingDaysWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/WorkingDaysWindow.java index 9acddc8..52ca493 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/WorkingDaysWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/windows/WorkingDaysWindow.java @@ -341,7 +341,7 @@ public class WorkingDaysWindow extends TWindow { WorkingDay wd = workingDayRepository.read(year, month, day); if (wd == null) { wd = new WorkingDay(WorkingDay.createId(year, month, day), - year, month, day, -1, -1, -1, -1, -1, -1, + year, month, day, -1, -1, -1, -1, -1, -1, -1, -1, "Fictive day", true,0); } workingDaysList.add(wd); @@ -383,6 +383,8 @@ public class WorkingDaysWindow extends TWindow { list2.add(THREE_DASHES); list2.add(THREE_DASHES); list2.add(THREE_DASHES); + list2.add(THREE_DASHES); + list2.add(THREE_DASHES); } else { TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute()); @@ -401,6 +403,13 @@ public class WorkingDaysWindow extends TWindow { list2.add( TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString() .substring(0, 5)); + list2.add( + new TTime(wdfs.getPauseStartHour(), wdfs.getPauseStartMinute()).toString() + .substring(0, 5)); + list2.add( + new TTime(wdfs.getPauseEndHour(), wdfs.getPauseEndMinute()).toString() + .substring(0, 5)); + } list2.add(wdfs.getNote()); list2.add(wdfs.isTimeOff() ? YES : NO); @@ -430,7 +439,7 @@ public class WorkingDaysWindow extends TWindow { } String[] columns = new String[] {"Day of Week", "Weekend", "Date", "Arrival", - "Departure", "Overtime", "Working time", "Pause time", + "Departure", "Overtime", "Working length", "Pause length", "Pause start", "Pause end", "Note", "Time off", "Forget overtime", "Total overtime", "Arrival MA7", "Arrival MA14", "Arrival MA28", "Arrival MA56"}; diff --git a/modules/time-calc-app/src/main/resources/db_migrations/sqlite/timecalc/V000008__alter_table_working_day_add_columns_pause_start_hour_and_pause_start_minute.sql b/modules/time-calc-app/src/main/resources/db_migrations/sqlite/timecalc/V000008__alter_table_working_day_add_columns_pause_start_hour_and_pause_start_minute.sql new file mode 100644 index 0000000..7a21207 --- /dev/null +++ b/modules/time-calc-app/src/main/resources/db_migrations/sqlite/timecalc/V000008__alter_table_working_day_add_columns_pause_start_hour_and_pause_start_minute.sql @@ -0,0 +1,2 @@ +ALTER TABLE "WORKING_DAY" ADD COLUMN "PAUSE_START_HOUR" NUMBER DEFAULT 11; +ALTER TABLE "WORKING_DAY" ADD COLUMN "PAUSE_START_MINUTE" NUMBER DEFAULT 0;