diff --git a/lib/taskana-core/src/main/java/pro/taskana/configuration/TaskanaEngineConfiguration.java b/lib/taskana-core/src/main/java/pro/taskana/configuration/TaskanaEngineConfiguration.java index b8361693b..a8f0a0e4f 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/configuration/TaskanaEngineConfiguration.java +++ b/lib/taskana-core/src/main/java/pro/taskana/configuration/TaskanaEngineConfiguration.java @@ -1,6 +1,8 @@ package pro.taskana.configuration; import java.sql.SQLException; +import java.time.LocalDate; +import java.util.List; import javax.sql.DataSource; @@ -36,6 +38,9 @@ public class TaskanaEngineConfiguration { protected boolean securityEnabled = true; protected boolean useManagedTransactions; + private boolean germanPublicHolidaysEnabled; + private List customHolidays; + public TaskanaEngineConfiguration(boolean enableSecurity) { this.securityEnabled = enableSecurity; } @@ -134,6 +139,22 @@ public class TaskanaEngineConfiguration { this.propertiesSeparator = propertiesSeparator; } + public boolean isGermanPublicHolidaysEnabled() { + return this.germanPublicHolidaysEnabled; + } + + public void setGermanPublicHolidaysEnabled(boolean germanPublicHolidaysEnabled) { + this.germanPublicHolidaysEnabled = germanPublicHolidaysEnabled; + } + + public List getCustomHolidays() { + return customHolidays; + } + + public void setCustomHolidays(List customHolidays) { + this.customHolidays = customHolidays; + } + /** * Helper method to determine whether all access ids (user Id and group ids) should be used in lower case. * 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 375ffe5d8..10215b0d4 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 @@ -2,6 +2,7 @@ package pro.taskana.impl; import java.time.DayOfWeek; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; @@ -27,12 +28,16 @@ public final class DaysToWorkingDaysConverter { private static ArrayList positiveDaysToWorkingDays; private static ArrayList negativeDaysToWorkingDays; private static Instant dateCreated; + private static LocalDate easterSunday; + private static boolean germanHolidaysEnabled; + private static List customHolidays; private DaysToWorkingDaysConverter(List reportLineItemDefinitions, Instant referenceDate) { + easterSunday = getEasterSunday(LocalDateTime.ofInstant(referenceDate, ZoneId.systemDefault()).getYear()); + dateCreated = referenceDate; positiveDaysToWorkingDays = generatePositiveDaysToWorkingDays(reportLineItemDefinitions, referenceDate); negativeDaysToWorkingDays = generateNegativeDaysToWorkingDays(reportLineItemDefinitions, referenceDate); - dateCreated = referenceDate; } /** @@ -160,10 +165,77 @@ public final class DaysToWorkingDaysConverter { if (LocalDateTime.ofInstant(referenceDate, ZoneId.systemDefault()).plusDays(day).getDayOfWeek().equals( DayOfWeek.SATURDAY) || LocalDateTime.ofInstant(referenceDate, ZoneId.systemDefault()).plusDays(day).getDayOfWeek().equals( - DayOfWeek.SUNDAY)) { + DayOfWeek.SUNDAY) + || isHoliday(LocalDateTime.ofInstant(referenceDate, ZoneId.systemDefault()).plusDays(day).toLocalDate())) { return false; } return true; } + private boolean isHoliday(LocalDate date) { + if (germanHolidaysEnabled) { + // Fix and movable holidays that are valid throughout Germany: New years day, Labour Day, Day of German + // Unity, Christmas, Good Friday, Easter Monday, Ascension Day, Whit Monday. + if (date.getDayOfMonth() == 1 && date.getMonthValue() == 1 + || date.getDayOfMonth() == 1 && date.getMonthValue() == 5 + || date.getDayOfMonth() == 3 && date.getMonthValue() == 10 + || date.getDayOfMonth() == 25 && date.getMonthValue() == 12 + || date.getDayOfMonth() == 26 && date.getMonthValue() == 12 + || easterSunday.minusDays(2).equals(date) + || easterSunday.plusDays(1).equals(date) + || easterSunday.plusDays(39).equals(date) + || easterSunday.plusDays(50).equals(date)) { + return true; + } + } + if (customHolidays != null) { + // Custom holidays that can be configured in the TaskanaEngineConfiguration + for (LocalDate customHoliday : customHolidays) { + if (date.equals(customHoliday)) { + return true; + } + } + } + return false; + } + + public LocalDate getEasterSunday(int year) { + // Formula to compute Easter Sunday by Gauss. + int a = year % 19; + int b = year % 4; + int c = year % 7; + int k = year / 100; + int p = (13 + 8 * k) / 25; + int q = k / 4; + int m = (15 - p + k - q) % 30; + int n = (4 + k - q) % 7; + int d = (19 * a + m) % 30; + + int e = (2 * b + 4 * c + 6 * d + n) % 7; + + if (d == 29 && e == 6) { + return LocalDate.of(year, 3, 15).plusDays(d + e); + } + if (d == 28 && e == 6 && (11 * m + 11) % 30 < 19) { + return LocalDate.of(year, 3, 15).plusDays(d + e); + } + return LocalDate.of(year, 3, 22).plusDays(d + e); + } + + public static void setCustomHolidays(List holidays) { + customHolidays = holidays; + } + + public List getCustomHolidays() { + return customHolidays; + } + + public static void setGermanPublicHolidaysEnabled(boolean germanPublicHolidaysEnabled) { + germanHolidaysEnabled = germanPublicHolidaysEnabled; + } + + public boolean isGermanPublicHolidayEnabled() { + return germanHolidaysEnabled; + } + } 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 42382f26c..bd90239f8 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 @@ -52,6 +52,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); + configureDaysToWorkingDaysConverter(); + Report report = new Report(); List monitorQueryItems = taskMonitorMapper .getTaskCountOfWorkbasketsByWorkbasketsAndStates(workbasketIds, states, categories, domains); @@ -61,7 +63,6 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { } finally { taskanaEngineImpl.returnConnection(); LOGGER.debug("exit from getWorkbasketLevelReport()."); - } } @@ -91,6 +92,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); + configureDaysToWorkingDaysConverter(); + Report report = new Report(); List monitorQueryItems = taskMonitorMapper .getTaskCountOfCategoriesByWorkbasketsAndStates(workbasketIds, states, categories, domains); @@ -130,6 +133,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); + configureDaysToWorkingDaysConverter(); + ClassificationReport report = new ClassificationReport(); List monitorQueryItems = taskMonitorMapper .getTaskCountOfClassificationsByWorkbasketsAndStates(workbasketIds, states, categories, domains); @@ -173,6 +178,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); + configureDaysToWorkingDaysConverter(); + DetailedClassificationReport report = new DetailedClassificationReport(); List detailedMonitorQueryItems = taskMonitorMapper .getTaskCountOfDetailedClassificationsByWorkbasketsAndStates(workbasketIds, states, categories, @@ -217,6 +224,8 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); + configureDaysToWorkingDaysConverter(); + Report report = new Report(); List monitorQueryItems = taskMonitorMapper .getTaskCountOfCustomFieldValuesByWorkbasketsAndStatesAndCustomField(workbasketIds, states, categories, @@ -230,4 +239,10 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { } } + private void configureDaysToWorkingDaysConverter() { + DaysToWorkingDaysConverter.setCustomHolidays(taskanaEngineImpl.getConfiguration().getCustomHolidays()); + DaysToWorkingDaysConverter.setGermanPublicHolidaysEnabled( + this.taskanaEngineImpl.getConfiguration().isGermanPublicHolidaysEnabled()); + } + } diff --git a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java index a0e57ed6e..e947d68b9 100644 --- a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java @@ -51,6 +51,7 @@ public class ProvideCategoryReportAccTest { cleaner.clearDb(dataSource, true); dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false); + taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); ((TaskanaEngineImpl) taskanaEngine).setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); cleaner.clearDb(dataSource, false); diff --git a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideClassificationReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideClassificationReportAccTest.java index 5f83d4957..20fab7d9d 100644 --- a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideClassificationReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideClassificationReportAccTest.java @@ -51,6 +51,7 @@ public class ProvideClassificationReportAccTest { cleaner.clearDb(dataSource, true); dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false); + taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); ((TaskanaEngineImpl) taskanaEngine).setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); cleaner.clearDb(dataSource, false); diff --git a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCustomFieldValueReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCustomFieldValueReportAccTest.java index 2cf591b60..65a7969db 100644 --- a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCustomFieldValueReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCustomFieldValueReportAccTest.java @@ -52,6 +52,7 @@ public class ProvideCustomFieldValueReportAccTest { cleaner.clearDb(dataSource, true); dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false); + taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); ((TaskanaEngineImpl) taskanaEngine).setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); cleaner.clearDb(dataSource, false); diff --git a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideDetailedClassificationReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideDetailedClassificationReportAccTest.java index 52ac55665..8231c6a61 100644 --- a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideDetailedClassificationReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideDetailedClassificationReportAccTest.java @@ -54,6 +54,7 @@ public class ProvideDetailedClassificationReportAccTest { cleaner.clearDb(dataSource, true); dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false); + taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); ((TaskanaEngineImpl) taskanaEngine).setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); cleaner.clearDb(dataSource, false); diff --git a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java index 4e25a046a..9ef2a861c 100644 --- a/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java @@ -51,6 +51,7 @@ public class ProvideWorkbasketLevelReportAccTest { cleaner.clearDb(dataSource, true); dataSource = TaskanaEngineConfigurationTest.getDataSource(); taskanaEngineConfiguration = new TaskanaEngineConfiguration(dataSource, false); + taskanaEngineConfiguration.setGermanPublicHolidaysEnabled(false); taskanaEngine = taskanaEngineConfiguration.buildTaskanaEngine(); ((TaskanaEngineImpl) taskanaEngine).setConnectionManagementMode(ConnectionManagementMode.AUTOCOMMIT); cleaner.clearDb(dataSource, false); 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 5896dcf4b..c3065065c 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 @@ -4,9 +4,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import java.time.Instant; +import java.time.LocalDate; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.junit.BeforeClass; import org.junit.Test; /** @@ -14,6 +17,14 @@ import org.junit.Test; */ public class DaysToWorkingDaysConverterTest { + @BeforeClass + public static void setup() { + DaysToWorkingDaysConverter.setGermanPublicHolidaysEnabled(true); + LocalDate dayOfReformation = LocalDate.of(2018, 10, 31); + LocalDate allSaintsDays = LocalDate.of(2018, 11, 1); + DaysToWorkingDaysConverter.setCustomHolidays(Arrays.asList(dayOfReformation, allSaintsDays)); + } + @Test public void testInitializeForDifferentReportLineItemDefinitions() { DaysToWorkingDaysConverter instance1 = DaysToWorkingDaysConverter @@ -61,6 +72,146 @@ public class DaysToWorkingDaysConverterTest { assertEquals(16, instance.convertDaysToWorkingDays(16)); } + @Test + public void testEasterHolidays() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-03-28T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(1, instance.convertDaysToWorkingDays(2)); + assertEquals(1, instance.convertDaysToWorkingDays(3)); + assertEquals(1, instance.convertDaysToWorkingDays(4)); + assertEquals(1, instance.convertDaysToWorkingDays(5)); + assertEquals(2, instance.convertDaysToWorkingDays(6)); + } + + @Test + public void testWhitsunHolidays() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-05-16T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(2, instance.convertDaysToWorkingDays(2)); + assertEquals(2, instance.convertDaysToWorkingDays(3)); + assertEquals(2, instance.convertDaysToWorkingDays(4)); + assertEquals(2, instance.convertDaysToWorkingDays(5)); + assertEquals(3, instance.convertDaysToWorkingDays(6)); + } + + @Test + public void testLabourDayHoliday() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-04-26T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(1, instance.convertDaysToWorkingDays(2)); + assertEquals(1, instance.convertDaysToWorkingDays(3)); + assertEquals(2, instance.convertDaysToWorkingDays(4)); + assertEquals(2, instance.convertDaysToWorkingDays(5)); + assertEquals(3, instance.convertDaysToWorkingDays(6)); + assertEquals(4, instance.convertDaysToWorkingDays(7)); + } + + @Test + public void testAscensionDayHoliday() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-05-07T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(2, instance.convertDaysToWorkingDays(2)); + assertEquals(2, instance.convertDaysToWorkingDays(3)); + assertEquals(3, instance.convertDaysToWorkingDays(4)); + assertEquals(3, instance.convertDaysToWorkingDays(5)); + assertEquals(3, instance.convertDaysToWorkingDays(6)); + assertEquals(4, instance.convertDaysToWorkingDays(7)); + } + + @Test + public void testDayOfGermanUnityHoliday() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-10-01T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(1, instance.convertDaysToWorkingDays(2)); + assertEquals(2, instance.convertDaysToWorkingDays(3)); + assertEquals(3, instance.convertDaysToWorkingDays(4)); + assertEquals(3, instance.convertDaysToWorkingDays(5)); + assertEquals(3, instance.convertDaysToWorkingDays(6)); + assertEquals(4, instance.convertDaysToWorkingDays(7)); + } + + @Test + public void testChristmasAndNewYearHolidays() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-12-20T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(1, instance.convertDaysToWorkingDays(2)); + assertEquals(1, instance.convertDaysToWorkingDays(3)); + assertEquals(2, instance.convertDaysToWorkingDays(4)); + assertEquals(2, instance.convertDaysToWorkingDays(5)); + assertEquals(2, instance.convertDaysToWorkingDays(6)); + assertEquals(3, instance.convertDaysToWorkingDays(7)); + assertEquals(4, instance.convertDaysToWorkingDays(8)); + assertEquals(4, instance.convertDaysToWorkingDays(9)); + assertEquals(4, instance.convertDaysToWorkingDays(10)); + assertEquals(5, instance.convertDaysToWorkingDays(11)); + assertEquals(5, instance.convertDaysToWorkingDays(12)); + assertEquals(6, instance.convertDaysToWorkingDays(13)); + assertEquals(7, instance.convertDaysToWorkingDays(14)); + } + + @Test + public void testCustomHolidaysWithDayOfReformationAndAllSaintsDay() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), Instant.parse("2018-10-26T00:00:00.000Z")); + + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(0, instance.convertDaysToWorkingDays(1)); + assertEquals(0, instance.convertDaysToWorkingDays(2)); + assertEquals(1, instance.convertDaysToWorkingDays(3)); + assertEquals(2, instance.convertDaysToWorkingDays(4)); + assertEquals(2, instance.convertDaysToWorkingDays(5)); + assertEquals(2, instance.convertDaysToWorkingDays(6)); + assertEquals(3, instance.convertDaysToWorkingDays(7)); + + } + + @Test + public void testgetEasterSunday() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getShortListOfReportLineItemDefinitions(), Instant.parse("2018-02-27T00:00:00.000Z")); + + assertEquals(LocalDate.of(2018, 4, 1), instance.getEasterSunday(2018)); + assertEquals(LocalDate.of(2019, 4, 21), instance.getEasterSunday(2019)); + assertEquals(LocalDate.of(2020, 4, 12), instance.getEasterSunday(2020)); + assertEquals(LocalDate.of(2021, 4, 4), instance.getEasterSunday(2021)); + assertEquals(LocalDate.of(2022, 4, 17), instance.getEasterSunday(2022)); + assertEquals(LocalDate.of(2023, 4, 9), instance.getEasterSunday(2023)); + assertEquals(LocalDate.of(2024, 3, 31), instance.getEasterSunday(2024)); + assertEquals(LocalDate.of(2025, 4, 20), instance.getEasterSunday(2025)); + assertEquals(LocalDate.of(2026, 4, 5), instance.getEasterSunday(2026)); + assertEquals(LocalDate.of(2027, 3, 28), instance.getEasterSunday(2027)); + assertEquals(LocalDate.of(2028, 4, 16), instance.getEasterSunday(2028)); + assertEquals(LocalDate.of(2029, 4, 1), instance.getEasterSunday(2029)); + assertEquals(LocalDate.of(2030, 4, 21), instance.getEasterSunday(2030)); + assertEquals(LocalDate.of(2031, 4, 13), instance.getEasterSunday(2031)); + assertEquals(LocalDate.of(2032, 3, 28), instance.getEasterSunday(2032)); + assertEquals(LocalDate.of(2033, 4, 17), instance.getEasterSunday(2033)); + assertEquals(LocalDate.of(2034, 4, 9), instance.getEasterSunday(2034)); + assertEquals(LocalDate.of(2035, 3, 25), instance.getEasterSunday(2035)); + assertEquals(LocalDate.of(2040, 4, 1), instance.getEasterSunday(2040)); + assertEquals(LocalDate.of(2050, 4, 10), instance.getEasterSunday(2050)); + assertEquals(LocalDate.of(2100, 3, 28), instance.getEasterSunday(2100)); + + } + private List getShortListOfReportLineItemDefinitions() { List reportLineItemDefinitions = new ArrayList<>(); reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -3)); diff --git a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskMonitorServiceImplTest.java b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskMonitorServiceImplTest.java index 8599496cc..908e2c1c8 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/impl/TaskMonitorServiceImplTest.java +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/TaskMonitorServiceImplTest.java @@ -21,6 +21,7 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.junit.MockitoJUnitRunner; +import pro.taskana.configuration.TaskanaEngineConfiguration; import pro.taskana.mappings.TaskMonitorMapper; /** @@ -35,6 +36,9 @@ public class TaskMonitorServiceImplTest { @Mock private TaskanaEngineImpl taskanaEngineImplMock; + @Mock + private TaskanaEngineConfiguration taskanaEngineConfiguration; + @Mock private TaskMonitorMapper taskMonitorMapperMock; @@ -43,6 +47,9 @@ public class TaskMonitorServiceImplTest { MockitoAnnotations.initMocks(this); Mockito.doNothing().when(taskanaEngineImplMock).openConnection(); Mockito.doNothing().when(taskanaEngineImplMock).returnConnection(); + doReturn(taskanaEngineConfiguration).when(taskanaEngineImplMock).getConfiguration(); + doReturn(true).when(taskanaEngineConfiguration).isGermanPublicHolidaysEnabled(); + doReturn(null).when(taskanaEngineConfiguration).getCustomHolidays(); } @Test @@ -63,10 +70,13 @@ public class TaskMonitorServiceImplTest { Report actualResult = cut.getWorkbasketLevelReport(workbasketIds, states, categories, domains); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfWorkbasketsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals( @@ -96,10 +106,13 @@ public class TaskMonitorServiceImplTest { reportLineItemDefinitions); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfWorkbasketsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals( @@ -132,10 +145,13 @@ public class TaskMonitorServiceImplTest { Report actualResult = cut.getCategoryReport(workbasketIds, states, categories, domains); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfCategoriesByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals(actualResult.getReportLines().get("EXTERN").getTotalNumberOfTasks(), 1); @@ -164,10 +180,13 @@ public class TaskMonitorServiceImplTest { reportLineItemDefinitions); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfCategoriesByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals(actualResult.getReportLines().get("EXTERN").getTotalNumberOfTasks(), 1); @@ -193,10 +212,13 @@ public class TaskMonitorServiceImplTest { ClassificationReport actualResult = cut.getClassificationReport(workbasketIds, states, categories, domains); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfClassificationsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals( @@ -226,10 +248,13 @@ public class TaskMonitorServiceImplTest { reportLineItemDefinitions); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfClassificationsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals( @@ -262,10 +287,13 @@ public class TaskMonitorServiceImplTest { categories, domains); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfDetailedClassificationsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); DetailedReportLine line = (DetailedReportLine) actualResult.getReportLines() .get("CLI:000000000000000000000000000000000001"); @@ -295,14 +323,16 @@ public class TaskMonitorServiceImplTest { .getTaskCountOfDetailedClassificationsByWorkbasketsAndStates(workbasketIds, states, categories, domains); DetailedClassificationReport actualResult = cut.getDetailedClassificationReport(workbasketIds, states, - categories, - domains, reportLineItemDefinitions); + categories, domains, reportLineItemDefinitions); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)).getTaskCountOfDetailedClassificationsByWorkbasketsAndStates(any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); DetailedReportLine line = (DetailedReportLine) actualResult.getReportLines() .get("CLI:000000000000000000000000000000000001"); @@ -339,10 +369,13 @@ public class TaskMonitorServiceImplTest { CustomField.CUSTOM_1); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)) .getTaskCountOfCustomFieldValuesByWorkbasketsAndStatesAndCustomField(any(), any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals(actualResult.getReportLines().get("Geschaeftsstelle A").getTotalNumberOfTasks(), 1); @@ -372,10 +405,13 @@ public class TaskMonitorServiceImplTest { CustomField.CUSTOM_1, reportLineItemDefinitions); verify(taskanaEngineImplMock, times(1)).openConnection(); + verify(taskanaEngineImplMock, times(2)).getConfiguration(); + verify(taskanaEngineConfiguration, times(1)).isGermanPublicHolidaysEnabled(); + verify(taskanaEngineConfiguration, times(1)).getCustomHolidays(); verify(taskMonitorMapperMock, times(1)) .getTaskCountOfCustomFieldValuesByWorkbasketsAndStatesAndCustomField(any(), any(), any(), any(), any()); verify(taskanaEngineImplMock, times(1)).returnConnection(); - verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock); + verifyNoMoreInteractions(taskanaEngineImplMock, taskMonitorMapperMock, taskanaEngineConfiguration); assertNotNull(actualResult); assertEquals(actualResult.getReportLines().get("Geschaeftsstelle A").getTotalNumberOfTasks(), 1);