From 7dc951351d23f404fd6a95ed22231b5c7ce85019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Wed, 14 Mar 2018 07:04:38 +0100 Subject: [PATCH] TSK-379: Return all matching days in DaysToWorkingDaysConverter - Now method convertWorkingDaysToDays returns all days that match to the inserted working day to include weekends and holidays --- .../impl/DaysToWorkingDaysConverter.java | 47 ++++++-- .../taskana/impl/TaskMonitorServiceImpl.java | 7 +- .../impl/DaysToWorkingDaysConverterTest.java | 114 ++++++++++++++---- 3 files changed, 130 insertions(+), 38 deletions(-) diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java b/lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java index d98eed71c..8fb7f44ef 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java @@ -120,33 +120,56 @@ public final class DaysToWorkingDaysConverter { /** * Converts an integer, that represents the age in working days, to the age in days by using the table that was - * created by initialization. If the age in working days is beyond the limits of the table, the integer will be - * returned unchanged. + * created by initialization. Because one age in working days could match to more than one age in days, the return + * value is a list of all days that match to the input parameter. If the age in working days is beyond the limits of + * the table, the integer will be returned unchanged. * * @param ageInWorkingDays * represents the age in working days - * @return the age in days + * @return a list of age in days */ - public int convertWorkingDaysToDays(int ageInWorkingDays) { + public ArrayList convertWorkingDaysToDays(int ageInWorkingDays) { + + ArrayList list = new ArrayList<>(); int minWorkingDay = negativeDaysToWorkingDays.get(negativeDaysToWorkingDays.size() - 1); int maxWorkingDay = positiveDaysToWorkingDays.get(positiveDaysToWorkingDays.size() - 1); - int ageInDays = 0; if (ageInWorkingDays >= minWorkingDay && ageInWorkingDays < 0) { - while (negativeDaysToWorkingDays.get(ageInDays) > ageInWorkingDays) { - ageInDays++; + for (int ageInDays = 0; ageInDays < negativeDaysToWorkingDays.size(); ageInDays++) { + if (negativeDaysToWorkingDays.get(ageInDays) == ageInWorkingDays) { + list.add(-ageInDays); + } } - return -ageInDays; + return list; } if (ageInWorkingDays > 0 && ageInWorkingDays <= maxWorkingDay) { - while (positiveDaysToWorkingDays.get(ageInDays) < ageInWorkingDays) { - ageInDays++; + for (int ageInDays = 0; ageInDays < positiveDaysToWorkingDays.size(); ageInDays++) { + if (positiveDaysToWorkingDays.get(ageInDays) == ageInWorkingDays) { + list.add(ageInDays); + } } - return ageInDays; + return list; } - return ageInWorkingDays; + if (ageInWorkingDays == 0) { + list.add(0); + for (int ageInDays = 1; ageInDays < positiveDaysToWorkingDays.size(); ageInDays++) { + if (positiveDaysToWorkingDays.get(ageInDays) == ageInWorkingDays) { + list.add(ageInDays); + } + } + for (int ageInDays = 1; ageInDays < negativeDaysToWorkingDays.size(); ageInDays++) { + if (negativeDaysToWorkingDays.get(ageInDays) == ageInWorkingDays) { + list.add(-ageInDays); + } + } + return list; + } + + // If ageInWorkingDays is beyond the limits of the table, the value is returned unchanged. + list.add(ageInWorkingDays); + return list; } public long convertWorkingDaysToDays(Instant startTime, long numberOfDays) { diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskMonitorServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskMonitorServiceImpl.java index b0736d8eb..e2a10a19e 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/TaskMonitorServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/TaskMonitorServiceImpl.java @@ -1,5 +1,6 @@ package pro.taskana.impl; +import java.util.Collections; import java.util.List; import org.slf4j.Logger; @@ -322,8 +323,10 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter.initialize(reportLineItemDefinitions); for (SelectedItem selectedItem : selectedItems) { - selectedItem.setLowerAgeLimit(instance.convertWorkingDaysToDays(selectedItem.getLowerAgeLimit())); - selectedItem.setUpperAgeLimit(instance.convertWorkingDaysToDays(selectedItem.getUpperAgeLimit())); + selectedItem + .setLowerAgeLimit(Collections.min(instance.convertWorkingDaysToDays(selectedItem.getLowerAgeLimit()))); + selectedItem + .setUpperAgeLimit(Collections.max(instance.convertWorkingDaysToDays(selectedItem.getUpperAgeLimit()))); } return selectedItems; } diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java index 491e25045..181bf4423 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java @@ -136,32 +136,98 @@ public class DaysToWorkingDaysConverterTest { DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-02-27T00:00:00.000Z")); - assertEquals(-13, instance.convertWorkingDaysToDays(-13)); - assertEquals(-12, instance.convertWorkingDaysToDays(-12)); + assertEquals(Arrays.asList(-13), instance.convertWorkingDaysToDays(-13)); + assertEquals(Arrays.asList(-12), instance.convertWorkingDaysToDays(-12)); - assertEquals(-12, instance.convertWorkingDaysToDays(-8)); - assertEquals(-11, instance.convertWorkingDaysToDays(-7)); - assertEquals(-8, instance.convertWorkingDaysToDays(-6)); - assertEquals(-7, instance.convertWorkingDaysToDays(-5)); - assertEquals(-6, instance.convertWorkingDaysToDays(-4)); - assertEquals(-5, instance.convertWorkingDaysToDays(-3)); - assertEquals(-4, instance.convertWorkingDaysToDays(-2)); - assertEquals(-1, instance.convertWorkingDaysToDays(-1)); - assertEquals(0, instance.convertWorkingDaysToDays(0)); - assertEquals(1, instance.convertWorkingDaysToDays(1)); - assertEquals(2, instance.convertWorkingDaysToDays(2)); - assertEquals(3, instance.convertWorkingDaysToDays(3)); - assertEquals(6, instance.convertWorkingDaysToDays(4)); - assertEquals(7, instance.convertWorkingDaysToDays(5)); - assertEquals(8, instance.convertWorkingDaysToDays(6)); - assertEquals(9, instance.convertWorkingDaysToDays(7)); - assertEquals(10, instance.convertWorkingDaysToDays(8)); - assertEquals(13, instance.convertWorkingDaysToDays(9)); - assertEquals(14, instance.convertWorkingDaysToDays(10)); - assertEquals(15, instance.convertWorkingDaysToDays(11)); + assertEquals(Arrays.asList(-12), instance.convertWorkingDaysToDays(-8)); + assertEquals(Arrays.asList(-11), instance.convertWorkingDaysToDays(-7)); + assertEquals(Arrays.asList(-8, -9, -10), instance.convertWorkingDaysToDays(-6)); + assertEquals(Arrays.asList(-7), instance.convertWorkingDaysToDays(-5)); + assertEquals(Arrays.asList(-6), instance.convertWorkingDaysToDays(-4)); + assertEquals(Arrays.asList(-5), instance.convertWorkingDaysToDays(-3)); + assertEquals(Arrays.asList(-4), instance.convertWorkingDaysToDays(-2)); + assertEquals(Arrays.asList(-1, -2, -3), instance.convertWorkingDaysToDays(-1)); + assertEquals(Arrays.asList(0), instance.convertWorkingDaysToDays(0)); + assertEquals(Arrays.asList(1), instance.convertWorkingDaysToDays(1)); + assertEquals(Arrays.asList(2), instance.convertWorkingDaysToDays(2)); + assertEquals(Arrays.asList(3, 4, 5), instance.convertWorkingDaysToDays(3)); + assertEquals(Arrays.asList(6), instance.convertWorkingDaysToDays(4)); + assertEquals(Arrays.asList(7), instance.convertWorkingDaysToDays(5)); + assertEquals(Arrays.asList(8), instance.convertWorkingDaysToDays(6)); + assertEquals(Arrays.asList(9), instance.convertWorkingDaysToDays(7)); + assertEquals(Arrays.asList(10, 11, 12), instance.convertWorkingDaysToDays(8)); + assertEquals(Arrays.asList(13), instance.convertWorkingDaysToDays(9)); + assertEquals(Arrays.asList(14), instance.convertWorkingDaysToDays(10)); + assertEquals(Arrays.asList(15), instance.convertWorkingDaysToDays(11)); - assertEquals(12, instance.convertWorkingDaysToDays(12)); - assertEquals(13, instance.convertWorkingDaysToDays(13)); + assertEquals(Arrays.asList(12), instance.convertWorkingDaysToDays(12)); + assertEquals(Arrays.asList(13), instance.convertWorkingDaysToDays(13)); + } + + @Test + public void testConvertWorkingDaysToDaysAtWeekend() throws InvalidArgumentException { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-03-10T00:00:00.000Z")); + + assertEquals(Arrays.asList(-13), instance.convertWorkingDaysToDays(-13)); + assertEquals(Arrays.asList(-12), instance.convertWorkingDaysToDays(-12)); + + assertEquals(Arrays.asList(-10), instance.convertWorkingDaysToDays(-8)); + assertEquals(Arrays.asList(-9), instance.convertWorkingDaysToDays(-7)); + assertEquals(Arrays.asList(-8), instance.convertWorkingDaysToDays(-6)); + assertEquals(Arrays.asList(-5, -6, -7), instance.convertWorkingDaysToDays(-5)); + assertEquals(Arrays.asList(-4), instance.convertWorkingDaysToDays(-4)); + assertEquals(Arrays.asList(-3), instance.convertWorkingDaysToDays(-3)); + assertEquals(Arrays.asList(-2), instance.convertWorkingDaysToDays(-2)); + assertEquals(Arrays.asList(-1), instance.convertWorkingDaysToDays(-1)); + assertEquals(Arrays.asList(0, 1), instance.convertWorkingDaysToDays(0)); + assertEquals(Arrays.asList(2), instance.convertWorkingDaysToDays(1)); + assertEquals(Arrays.asList(3), instance.convertWorkingDaysToDays(2)); + assertEquals(Arrays.asList(4), instance.convertWorkingDaysToDays(3)); + assertEquals(Arrays.asList(5), instance.convertWorkingDaysToDays(4)); + assertEquals(Arrays.asList(6, 7, 8), instance.convertWorkingDaysToDays(5)); + assertEquals(Arrays.asList(9), instance.convertWorkingDaysToDays(6)); + assertEquals(Arrays.asList(10), instance.convertWorkingDaysToDays(7)); + assertEquals(Arrays.asList(11), instance.convertWorkingDaysToDays(8)); + assertEquals(Arrays.asList(12), instance.convertWorkingDaysToDays(9)); + assertEquals(Arrays.asList(13, 14, 15), instance.convertWorkingDaysToDays(10)); + assertEquals(Arrays.asList(16), instance.convertWorkingDaysToDays(11)); + + assertEquals(Arrays.asList(12), instance.convertWorkingDaysToDays(12)); + assertEquals(Arrays.asList(13), instance.convertWorkingDaysToDays(13)); + } + + @Test + public void testConvertWorkingDaysToDaysOnEasterSunday() throws InvalidArgumentException { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-04-01T00:00:00.000Z")); + + assertEquals(Arrays.asList(-13), instance.convertWorkingDaysToDays(-13)); + assertEquals(Arrays.asList(-12), instance.convertWorkingDaysToDays(-12)); + + assertEquals(Arrays.asList(-12), instance.convertWorkingDaysToDays(-8)); + assertEquals(Arrays.asList(-11), instance.convertWorkingDaysToDays(-7)); + assertEquals(Arrays.asList(-10), instance.convertWorkingDaysToDays(-6)); + assertEquals(Arrays.asList(-9), instance.convertWorkingDaysToDays(-5)); + assertEquals(Arrays.asList(-6, -7, -8), instance.convertWorkingDaysToDays(-4)); + assertEquals(Arrays.asList(-5), instance.convertWorkingDaysToDays(-3)); + assertEquals(Arrays.asList(-4), instance.convertWorkingDaysToDays(-2)); + assertEquals(Arrays.asList(-3), instance.convertWorkingDaysToDays(-1)); + assertEquals(Arrays.asList(0, 1, -1, -2), instance.convertWorkingDaysToDays(0)); + assertEquals(Arrays.asList(2), instance.convertWorkingDaysToDays(1)); + assertEquals(Arrays.asList(3), instance.convertWorkingDaysToDays(2)); + assertEquals(Arrays.asList(4), instance.convertWorkingDaysToDays(3)); + assertEquals(Arrays.asList(5, 6, 7), instance.convertWorkingDaysToDays(4)); + assertEquals(Arrays.asList(8), instance.convertWorkingDaysToDays(5)); + assertEquals(Arrays.asList(9), instance.convertWorkingDaysToDays(6)); + assertEquals(Arrays.asList(10), instance.convertWorkingDaysToDays(7)); + assertEquals(Arrays.asList(11), instance.convertWorkingDaysToDays(8)); + assertEquals(Arrays.asList(12, 13, 14), instance.convertWorkingDaysToDays(9)); + assertEquals(Arrays.asList(15), instance.convertWorkingDaysToDays(10)); + assertEquals(Arrays.asList(16), instance.convertWorkingDaysToDays(11)); + + assertEquals(Arrays.asList(12), instance.convertWorkingDaysToDays(12)); + assertEquals(Arrays.asList(13), instance.convertWorkingDaysToDays(13)); } @Test