mirror of
https://github.com/robertvokac/time-calc.git
synced 2025-03-25 07:27:49 +01:00
Added support for moving averages of arrival
This commit is contained in:
parent
4983528417
commit
7c4c26b0b6
@ -6,6 +6,8 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
||||||
* @since 23.02.2024
|
* @since 23.02.2024
|
||||||
@ -19,6 +21,9 @@ public class WorkingDay {
|
|||||||
|
|
||||||
private static final String NODATA = "nodata";
|
private static final String NODATA = "nodata";
|
||||||
|
|
||||||
|
public static String createId(Calendar cal) {
|
||||||
|
return createId(cal.get(Calendar.YEAR), cal.get((Calendar.MONTH)) + 1, cal.get(Calendar.DAY_OF_MONTH));
|
||||||
|
}
|
||||||
public static String createId(int year, int month, int day) {
|
public static String createId(int year, int month, int day) {
|
||||||
return (year + "-" + (month < 10 ? "0" : "") + month + "-" + (day < 10 ? "0" : "") + day);
|
return (year + "-" + (month < 10 ? "0" : "") + month + "-" + (day < 10 ? "0" : "") + day);
|
||||||
}
|
}
|
||||||
@ -40,5 +45,8 @@ public class WorkingDay {
|
|||||||
public boolean isThisDayTimeOff() {
|
public boolean isThisDayTimeOff() {
|
||||||
return timeOff || this.note.equals(NODATA);
|
return timeOff || this.note.equals(NODATA);
|
||||||
}
|
}
|
||||||
|
public double getArrivalAsDouble() {
|
||||||
|
return ((double)arrivalHour) + ((double)arrivalMinute / 60d);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
package org.nanoboot.utils.timecalc.entity;
|
package org.nanoboot.utils.timecalc.entity;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.nanoboot.utils.timecalc.app.TimeCalcException;
|
||||||
|
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import lombok.Getter;
|
import java.util.HashMap;
|
||||||
import lombok.Setter;
|
import java.util.HashSet;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -29,7 +35,107 @@ public class WorkingDayForStats extends WorkingDay {
|
|||||||
private final TTime departure;
|
private final TTime departure;
|
||||||
|
|
||||||
public static void fillStatisticsColumns(List<WorkingDayForStats> list) {
|
public static void fillStatisticsColumns(List<WorkingDayForStats> list) {
|
||||||
//todo
|
if(list.isEmpty()) {
|
||||||
|
//nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, WorkingDayForStats> map = new HashMap<>();
|
||||||
|
Set<Integer> years = new HashSet<>();
|
||||||
|
list.forEach(w -> {
|
||||||
|
if (!years.isEmpty() && !years.contains(w.getYear())) {
|
||||||
|
throw new TimeCalcException(
|
||||||
|
"Cannot create statistics, if there are work days for more than one year.");
|
||||||
|
}
|
||||||
|
years.add(w.getYear());
|
||||||
|
map.put(w.getId(), w);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
int year = years.stream().findFirst().orElseThrow(() -> new TimeCalcException("Set years is empty."));
|
||||||
|
|
||||||
|
Calendar cal7DaysAgo = Calendar.getInstance();
|
||||||
|
Calendar cal14DaysAgo = Calendar.getInstance();
|
||||||
|
Calendar cal28DaysAgo = Calendar.getInstance();
|
||||||
|
Calendar cal56DaysAgo = Calendar.getInstance();
|
||||||
|
|
||||||
|
List<WorkingDayForStats> list7 = new ArrayList<>();
|
||||||
|
List<WorkingDayForStats> list14 = new ArrayList<>();
|
||||||
|
List<WorkingDayForStats> list28 = new ArrayList<>();
|
||||||
|
List<WorkingDayForStats> list56 = new ArrayList<>();
|
||||||
|
for (int month = 1; month <= 12; month++) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.set(Calendar.YEAR, year);
|
||||||
|
cal.set(Calendar.MONTH, month - 1);
|
||||||
|
int dayMaximum = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
|
||||||
|
for (int day = 1; day <= dayMaximum; day++) {
|
||||||
|
String id = WorkingDay.createId(year, month, day);
|
||||||
|
if(!map.containsKey(id)) {
|
||||||
|
//nothing to do
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH, day);
|
||||||
|
cal7DaysAgo.setTime(cal.getTime());
|
||||||
|
cal14DaysAgo.setTime(cal.getTime());
|
||||||
|
cal28DaysAgo.setTime(cal.getTime());
|
||||||
|
cal56DaysAgo.setTime(cal.getTime());
|
||||||
|
cal7DaysAgo.add(Calendar.DAY_OF_MONTH, -7);
|
||||||
|
cal14DaysAgo.add(Calendar.DAY_OF_MONTH, -14);
|
||||||
|
cal28DaysAgo.add(Calendar.DAY_OF_MONTH, -28);
|
||||||
|
cal56DaysAgo.add(Calendar.DAY_OF_MONTH, -56);
|
||||||
|
String id7 = WorkingDay.createId(cal7DaysAgo);
|
||||||
|
String id14 = WorkingDay.createId(cal14DaysAgo);
|
||||||
|
String id28 = WorkingDay.createId(cal28DaysAgo);
|
||||||
|
String id56 = WorkingDay.createId(cal56DaysAgo);
|
||||||
|
|
||||||
|
System.out.println("id7=" + id7);
|
||||||
|
System.out.println("id14=" + id14);
|
||||||
|
System.out.println("id28=" + id28);
|
||||||
|
System.out.println("id56=" + id56);
|
||||||
|
if (map.containsKey(id7)) {
|
||||||
|
list7.remove(map.get(id7));
|
||||||
|
}
|
||||||
|
if (map.containsKey(id14)) {
|
||||||
|
list14.remove(map.get(id14));
|
||||||
|
}
|
||||||
|
if (map.containsKey(id28)) {
|
||||||
|
list28.remove(map.get(id28));
|
||||||
|
}
|
||||||
|
if (map.containsKey(id56)) {
|
||||||
|
list56.remove(map.get(id56));
|
||||||
|
}
|
||||||
|
WorkingDayForStats wd = map.get(id);
|
||||||
|
if(!wd.isThisDayTimeOff()) {
|
||||||
|
Stream.of(list7, list14, list28, list56).forEach(l -> {
|
||||||
|
l.add(wd);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
wd.setArrivalTimeMovingAverage7Days(list7.stream()
|
||||||
|
.map(WorkingDay::getArrivalAsDouble)
|
||||||
|
.mapToDouble(Double::doubleValue)
|
||||||
|
.average()
|
||||||
|
.orElse(0.0));
|
||||||
|
wd.setArrivalTimeMovingAverage14Days(list14.stream()
|
||||||
|
.map(WorkingDay::getArrivalAsDouble)
|
||||||
|
.mapToDouble(Double::doubleValue)
|
||||||
|
.average()
|
||||||
|
.orElse(0.0));
|
||||||
|
wd.setArrivalTimeMovingAverage28Days(list28.stream()
|
||||||
|
.map(WorkingDay::getArrivalAsDouble)
|
||||||
|
.mapToDouble(Double::doubleValue)
|
||||||
|
.average()
|
||||||
|
.orElse(0.0));
|
||||||
|
wd.setArrivalTimeMovingAverage56Days(list56.stream()
|
||||||
|
.map(WorkingDay::getArrivalAsDouble)
|
||||||
|
.mapToDouble(Double::doubleValue)
|
||||||
|
.average()
|
||||||
|
.orElse(0.0));
|
||||||
|
System.out.println(WorkingDay.createId(cal) + " 1 :: " + list7.size() );
|
||||||
|
System.out.println(WorkingDay.createId(cal) + " 2 :: " + list14.size() );
|
||||||
|
System.out.println(WorkingDay.createId(cal) + " 3 :: " + list28.size() );
|
||||||
|
System.out.println(WorkingDay.createId(cal) + " 4 :: " + list56.size() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
public static List<WorkingDayForStats> createList(List<WorkingDay> list) {
|
public static List<WorkingDayForStats> createList(List<WorkingDay> list) {
|
||||||
List<WorkingDayForStats> result = new ArrayList<>();
|
List<WorkingDayForStats> result = new ArrayList<>();
|
||||||
|
@ -3,7 +3,6 @@ package org.nanoboot.utils.timecalc.swing.common;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
@ -11,12 +10,12 @@ import javax.swing.JComboBox;
|
|||||||
import javax.swing.JScrollPane;
|
import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTable;
|
import javax.swing.JTable;
|
||||||
import javax.swing.table.DefaultTableModel;
|
import javax.swing.table.DefaultTableModel;
|
||||||
import org.nanoboot.utils.timecalc.app.TimeCalcProperty;
|
|
||||||
import org.nanoboot.utils.timecalc.entity.WorkingDay;
|
import org.nanoboot.utils.timecalc.entity.WorkingDay;
|
||||||
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
|
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
|
||||||
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
|
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
|
||||||
import static org.nanoboot.utils.timecalc.swing.common.ConfigWindow.CLIENT_PROPERTY_KEY;
|
|
||||||
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
import org.nanoboot.utils.timecalc.swing.progress.Time;
|
||||||
|
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,7 +28,7 @@ public class WorkingDaysWindow extends TWindow {
|
|||||||
private static final String THREE_DASHES = "---";
|
private static final String THREE_DASHES = "---";
|
||||||
//
|
//
|
||||||
private static final Color RED = new Color(255,153,153);
|
private static final Color RED = new Color(255,153,153);
|
||||||
public static final String E = "?";
|
public static final String QUESTION_MARK = "?";
|
||||||
|
|
||||||
private final WorkingDayRepositoryApi workingDayRepository;
|
private final WorkingDayRepositoryApi workingDayRepository;
|
||||||
private final Time time;
|
private final Time time;
|
||||||
@ -162,28 +161,28 @@ public class WorkingDaysWindow extends TWindow {
|
|||||||
list2.add(THREE_DASHES);
|
list2.add(THREE_DASHES);
|
||||||
list2.add(wdfs.getNote());
|
list2.add(wdfs.getNote());
|
||||||
list2.add(wdfs.isTimeOff() ? YES : NO);
|
list2.add(wdfs.isTimeOff() ? YES : NO);
|
||||||
list2.add(E);
|
list2.add(QUESTION_MARK);
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - 7));
|
||||||
} else {
|
} else {
|
||||||
list2.add(wdfs.getDayOfWeekAsString());
|
list2.add(wdfs.getDayOfWeekAsString());
|
||||||
TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute());
|
TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute());
|
||||||
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
|
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
|
||||||
list2.add(wdfs.getId());
|
list2.add(wdfs.getId());
|
||||||
list2.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5));
|
list2.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5) + " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalAsDouble())+ ")");
|
||||||
list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5));
|
list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5));
|
||||||
list2.add(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5));
|
list2.add(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5));
|
||||||
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5));
|
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5));
|
||||||
list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5));
|
list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5));
|
||||||
list2.add(wdfs.getNote());
|
list2.add(wdfs.getNote());
|
||||||
list2.add(wdfs.isTimeOff() ? YES : NO);
|
list2.add(wdfs.isTimeOff() ? YES : NO);
|
||||||
list2.add(E);
|
list2.add(QUESTION_MARK);
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - 7));
|
||||||
list2.add(E);
|
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - 7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user