From 1f01e7ad17475ff3211c39bec88f247f5ea0a8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Kl=C3=A4ger?= Date: Mon, 5 Feb 2018 07:20:08 +0100 Subject: [PATCH] TSK-228: Replace days by working days in the reports - Create a converter that converts days to working days by using a table - The table should exist all day if no changes are required - Create tests for this converter - Modify the existing report functions to count the age in working days - Update test and sample data - Remove empty lines from the WorkbasketLevelReport --- .../java/pro/taskana/TaskMonitorService.java | 58 +++++- .../impl/DaysToWorkingDaysConverter.java | 165 ++++++++++++++++++ .../taskana/impl/TaskMonitorServiceImpl.java | 83 ++++----- .../main/java/pro/taskana/model/Report.java | 4 +- .../java/pro/taskana/model/ReportLine.java | 1 - .../model/ReportLineItemDefinition.java | 91 +++++----- .../ProvideCategoryReportAccTest.java | 30 ++-- .../ProvideWorkbasketLevelReportAccTest.java | 35 ++-- .../taskana/database/TestDataGenerator.java | 6 +- .../impl/DaysToWorkingDaysConverterTest.java | 89 ++++++++++ 10 files changed, 439 insertions(+), 123 deletions(-) create mode 100644 lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java rename lib/taskana-core/src/test/java/acceptance/{task => monitoring}/ProvideCategoryReportAccTest.java (87%) rename lib/taskana-core/src/test/java/acceptance/{task => monitoring}/ProvideWorkbasketLevelReportAccTest.java (86%) create mode 100644 lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskMonitorService.java b/lib/taskana-core/src/main/java/pro/taskana/TaskMonitorService.java index e80dc58d8..490535b62 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskMonitorService.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskMonitorService.java @@ -68,8 +68,9 @@ public interface TaskMonitorService { /** * Returns a {@link Report} for a given list of {@link Workbasket}s, a given list of {@link TaskState}s and a given * list of {@link ReportLineItemDefinition}s. For each workbasket the report contains a list of ReportLineItems that - * subdivides the report in to different cluster grouped by the due date. Only tasks with a state in the list of - * TaskStates are provided. Tasks with Timestamp DUE = null are not considered. + * subdivides the report in to different cluster grouped by the due date. By default the age of the tasks is counted + * in working days. Only tasks with a state in the list of TaskStates are provided. Tasks with Timestamp DUE = null + * are not considered. * * @param workbaskets * a list of {@link Workbasket} objects that should be listed in the report @@ -86,6 +87,30 @@ public interface TaskMonitorService { Report getWorkbasketLevelReport(List workbaskets, List states, List reportLineItemDefinitions); + /** + * Returns a {@link Report} for a given list of {@link Workbasket}s, a given list of {@link TaskState}s and a given + * list of {@link ReportLineItemDefinition}s. For each workbasket the report contains a list of ReportLineItems that + * subdivides the report in to different cluster grouped by the due date. Only tasks with a state in the list of + * TaskStates are provided. Tasks with Timestamp DUE = null are not considered. + * + * @param workbaskets + * a list of {@link Workbasket} objects that should be listed in the report + * @param states + * a list of {@link TaskState} objects that specify the states of the tasks that are provided + * @param reportLineItemDefinitions + * a list of {@link ReportLineItemDefinition} objects that specify the subdivision into different cluster + * of due dates. Days in past are represented as negative values and days in the future are represented + * as positive values. To avoid tasks are counted multiple times or not be listed in the report, these + * reportLineItemDefinitions should not overlap and should not have gaps. If the ReportLineDefinition + * should represent a single day, lowerLimit and upperLimit have to be equal. + * @param inWorkingDays + * a boolean parameter that specifies whether the age of the tasks should be counted in days or in + * working days. + * @return a {@link Report} object that represents an overview of all tasks in the + */ + Report getWorkbasketLevelReport(List workbaskets, List states, + List reportLineItemDefinitions, boolean inWorkingDays); + /** * Returns a {@link Report} with categories for a given list of {@link Workbasket}s and for a given list of * {@link TaskState}s. The report only contains the number of all tasks of the respective category as well as the @@ -104,8 +129,9 @@ public interface TaskMonitorService { /** * Returns a {@link Report} with categories for a given list of {@link Workbasket}s, a given list of * {@link TaskState}s and a given list of {@link ReportLineItemDefinition}s. For each category the report contains a - * list of ReportLineItems that subdivides the report in to different cluster grouped by the due date. Only tasks - * with a state in the list of TaskStates are provided. Tasks with Timestamp DUE = null are not considered. + * list of ReportLineItems that subdivides the report in to different cluster grouped by the due date. By default + * the age of the tasks is counted in working days. Only tasks with a state in the list of TaskStates are provided. + * Tasks with Timestamp DUE = null are not considered. * * @param workbaskets * a list of {@link Workbasket} objects that should be listed in the report @@ -121,4 +147,28 @@ public interface TaskMonitorService { */ Report getCategoryReport(List workbaskets, List states, List reportLineItemDefinitions); + + /** + * Returns a {@link Report} with categories for a given list of {@link Workbasket}s, a given list of + * {@link TaskState}s and a given list of {@link ReportLineItemDefinition}s. For each category the report contains a + * list of ReportLineItems that subdivides the report in to different cluster grouped by the due date. Only tasks + * with a state in the list of TaskStates are provided. Tasks with Timestamp DUE = null are not considered. + * + * @param workbaskets + * a list of {@link Workbasket} objects that should be listed in the report + * @param states + * a list of {@link TaskState} objects that specify the states of the tasks that are provided + * @param reportLineItemDefinitions + * a list of {@link ReportLineItemDefinition} objects that specify the subdivision into different cluster + * of due dates. Days in past are represented as negative values and days in the future are represented + * as positive values. To avoid tasks are counted multiple times or not be listed in the report, these + * reportLineItemDefinitions should not overlap and should not have gaps. If the ReportLineDefinition + * should represent a single day, lowerLimit and upperLimit have to be equal. + * @param inWorkingDays + * a boolean parameter that specifies whether the age of the tasks should be counted in days or in + * working days. + * @return a {@link Report} object that represents an overview of all tasks of the respective category + */ + Report getCategoryReport(List workbaskets, List states, + List reportLineItemDefinitions, boolean inWorkingDays); } 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 new file mode 100644 index 000000000..d8d75c3d5 --- /dev/null +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/DaysToWorkingDaysConverter.java @@ -0,0 +1,165 @@ +package pro.taskana.impl; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import pro.taskana.impl.util.LoggerUtils; +import pro.taskana.model.ReportLineItemDefinition; + +/** + * The DaysToWorkingDaysConverter provides a method to convert an age in days into an age in working days. Before the + * method convertDaysToWorkingDays() can be used, the DaysToWorkingDaysConverter has to be initialized. For a list of + * {@link ReportLineItemDefinition}s the converter creates a "table" with integer that represents the age in days from + * the largest lower limit until the smallest upper limit of the reportLineItemDefinitions. This table is valid for a + * whole day until the converter is initialized with bigger limits. + */ +public final class DaysToWorkingDaysConverter { + + private static final Logger LOGGER = LoggerFactory.getLogger(TaskMonitorServiceImpl.class); + private static DaysToWorkingDaysConverter instance; + private static ArrayList positiveDaysToWorkingDays; + private static ArrayList negativeDaysToWorkingDays; + private static LocalDate dateCreated; + + private DaysToWorkingDaysConverter(List reportLineItemDefinitions, + LocalDate referenceDate) { + positiveDaysToWorkingDays = generatePositiveDaysToWorkingDays(reportLineItemDefinitions, referenceDate); + negativeDaysToWorkingDays = generateNegativeDaysToWorkingDays(reportLineItemDefinitions, referenceDate); + dateCreated = referenceDate; + } + + /** + * Initializes the DaysToWorkingDaysConverter for a list of {@link ReportLineItemDefinition}s and the current day. A + * new table is only created if there are bigger limits or the date has changed. + * + * @param reportLineItemDefinitions + * a list of {@link ReportLineItemDefinition}s that determines the size of the table + * @return an instance of the DaysToWorkingDaysConverter + */ + public static DaysToWorkingDaysConverter initialize(List reportLineItemDefinitions) { + return initialize(reportLineItemDefinitions, LocalDate.now()); + } + + /** + * Initializes the DaysToWorkingDaysConverter for a list of {@link ReportLineItemDefinition}s and a referenceDate. A + * new table is only created if there are bigger limits or the date has changed. + * + * @param reportLineItemDefinitions + * a list of {@link ReportLineItemDefinition}s that determines the size of the table + * @param referenceDate + * a {@link LocalDate} that represents the current day of the table + * @return an instance of the DaysToWorkingDaysConverter + */ + public static DaysToWorkingDaysConverter initialize(List reportLineItemDefinitions, + LocalDate referenceDate) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Initialize DaysToWorkingDaysConverter with reportLineItemDefinitions: {}", + LoggerUtils.listToString(reportLineItemDefinitions)); + } + int largesLowerLimit = getLargestLowerLimit(reportLineItemDefinitions); + int smallestUpperLimit = getSmallestUpperLimit(reportLineItemDefinitions); + if (instance == null + || !positiveDaysToWorkingDays.contains(largesLowerLimit) + || !negativeDaysToWorkingDays.contains(smallestUpperLimit) + || !dateCreated.isEqual(referenceDate)) { + + instance = new DaysToWorkingDaysConverter(reportLineItemDefinitions, referenceDate); + LOGGER.debug("Create new converter for the values from {} until {} for the date: {}.", largesLowerLimit, + smallestUpperLimit, dateCreated); + } + return instance; + } + + /** + * Converts an integer, that represents the age in days, to the age in working days by using the table that was + * created by initialization. If the age in days is beyond the limits of the table, the integer will be returned + * unchanged. + * + * @param ageInDays + * represents the age in days + * @return the age in working days + */ + public int convertDaysToWorkingDays(int ageInDays) { + + int minWorkingDay = -(negativeDaysToWorkingDays.size() - 1); + int maxWorkingDay = positiveDaysToWorkingDays.size() - 1; + + if (ageInDays >= minWorkingDay && ageInDays <= 0) { + return negativeDaysToWorkingDays.get(-ageInDays); + } + if (ageInDays > 0 && ageInDays <= maxWorkingDay) { + return positiveDaysToWorkingDays.get(ageInDays); + } + + return ageInDays; + } + + private ArrayList generateNegativeDaysToWorkingDays( + List reportLineItemDefinitions, LocalDate referenceDate) { + int minUpperLimit = getSmallestUpperLimit(reportLineItemDefinitions); + ArrayList daysToWorkingDays = new ArrayList<>(); + daysToWorkingDays.add(0); + int day = -1; + int workingDay = 0; + while (workingDay > minUpperLimit) { + if (isWorkingDay(day, referenceDate)) { + workingDay--; + } + daysToWorkingDays.add(workingDay); + day--; + } + return daysToWorkingDays; + } + + private ArrayList generatePositiveDaysToWorkingDays( + List reportLineItemDefinitions, LocalDate referenceDate) { + int maxLowerLimit = getLargestLowerLimit(reportLineItemDefinitions); + ArrayList daysToWorkingDays = new ArrayList<>(); + daysToWorkingDays.add(0); + + int day = 1; + int workingDay = 0; + while (workingDay < maxLowerLimit) { + if (isWorkingDay(day, referenceDate)) { + workingDay++; + } + daysToWorkingDays.add(workingDay); + day++; + } + return daysToWorkingDays; + } + + private static int getSmallestUpperLimit(List reportLineItemDefinitions) { + int smallestUpperLimit = 0; + for (ReportLineItemDefinition reportLineItemDefinition : reportLineItemDefinitions) { + if (reportLineItemDefinition.getUpperAgeLimit() < smallestUpperLimit) { + smallestUpperLimit = reportLineItemDefinition.getUpperAgeLimit(); + } + } + return smallestUpperLimit; + } + + private static int getLargestLowerLimit(List reportLineItemDefinitions) { + int greatestLowerLimit = 0; + for (ReportLineItemDefinition reportLineItemDefinition : reportLineItemDefinitions) { + if (reportLineItemDefinition.getUpperAgeLimit() > greatestLowerLimit) { + greatestLowerLimit = reportLineItemDefinition.getLowerAgeLimit(); + } + } + return greatestLowerLimit; + } + + private boolean isWorkingDay(int day, LocalDate referenceDate) { + if (referenceDate.plusDays(day).getDayOfWeek().equals(DayOfWeek.SATURDAY) + || referenceDate.plusDays(day).getDayOfWeek().equals(DayOfWeek.SUNDAY)) { + return false; + } + return true; + } + +} 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 70cf3b03b..f95592354 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 @@ -2,9 +2,7 @@ package pro.taskana.impl; import java.time.Duration; import java.time.Instant; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,12 +102,18 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { @Override public Report getWorkbasketLevelReport(List workbaskets, List states) { - return getWorkbasketLevelReport(workbaskets, states, null); + return getWorkbasketLevelReport(workbaskets, states, null, false); } @Override public Report getWorkbasketLevelReport(List workbaskets, List states, List reportLineItemDefinitions) { + return getWorkbasketLevelReport(workbaskets, states, reportLineItemDefinitions, true); + } + + @Override + public Report getWorkbasketLevelReport(List workbaskets, List states, + List reportLineItemDefinitions, boolean inWorkingDays) { if (LOGGER.isDebugEnabled()) { LOGGER.debug( "entry to getWorkbasketLevelReport(workbaskets = {}, states = {}, reportLineItemDefinitions = {})", @@ -119,36 +123,32 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); - Report report = new Report(); - report.setDetailLines(createEmptyDetailLinesForWorkbaskets(workbaskets, reportLineItemDefinitions)); - List monitorQueryItems = taskMonitorMapper .getTaskCountOfWorkbasketsByWorkbasketsAndStates(workbaskets, states); - for (MonitorQueryItem item : monitorQueryItems) { - report.getDetailLines().get(item.getKey()).addNumberOfTasks(item); - } - report.setSumLine(createEmptyReportLine(reportLineItemDefinitions)); - report.generateSumLine(); - - return report; + return createReport(reportLineItemDefinitions, inWorkingDays, monitorQueryItems); } finally { taskanaEngineImpl.returnConnection(); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("exit from getWorkbasketLevelReport()."); - } + LOGGER.debug("exit from getWorkbasketLevelReport()."); + } } @Override public Report getCategoryReport(List workbaskets, List states) { - return getCategoryReport(workbaskets, states, null); + return getCategoryReport(workbaskets, states, null, false); } @Override public Report getCategoryReport(List workbaskets, List states, List reportLineItemDefinitions) { + return getCategoryReport(workbaskets, states, reportLineItemDefinitions, true); + } + + @Override + public Report getCategoryReport(List workbaskets, List states, + List reportLineItemDefinitions, boolean inWorkingDays) { if (LOGGER.isDebugEnabled()) { LOGGER.debug( "entry to getCategoryReport(workbaskets = {}, states = {}, reportLineItemDefinitions = {})", @@ -158,29 +158,40 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { try { taskanaEngineImpl.openConnection(); - Report report = new Report(); - List monitorQueryItems = taskMonitorMapper .getTaskCountOfCategoriesByWorkbasketsAndStates(workbaskets, states); - for (MonitorQueryItem item : monitorQueryItems) { - if (!report.getDetailLines().containsKey(item.getKey())) { - report.getDetailLines().put(item.getKey(), createEmptyReportLine(reportLineItemDefinitions)); - } - report.getDetailLines().get(item.getKey()).addNumberOfTasks(item); - } - report.setSumLine(createEmptyReportLine(reportLineItemDefinitions)); - report.generateSumLine(); - return report; + return createReport(reportLineItemDefinitions, inWorkingDays, monitorQueryItems); } finally { taskanaEngineImpl.returnConnection(); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("exit from getCategoryReport()."); - } + LOGGER.debug("exit from getCategoryReport()."); } } + private Report createReport(List reportLineItemDefinitions, boolean inWorkingDays, + List monitorQueryItems) { + Report report = new Report(); + + DaysToWorkingDaysConverter instance = null; + if (reportLineItemDefinitions != null && inWorkingDays) { + instance = DaysToWorkingDaysConverter.initialize(reportLineItemDefinitions); + } + + for (MonitorQueryItem item : monitorQueryItems) { + if (instance != null) { + item.setAgeInDays(instance.convertDaysToWorkingDays(item.getAgeInDays())); + } + if (!report.getDetailLines().containsKey(item.getKey())) { + report.getDetailLines().put(item.getKey(), createEmptyReportLine(reportLineItemDefinitions)); + } + report.getDetailLines().get(item.getKey()).addNumberOfTasks(item); + } + + report.generateSumLine(createEmptyReportLine(reportLineItemDefinitions)); + return report; + } + private ReportLine createEmptyReportLine(List reportLineItemDefinitions) { ReportLine reportLine = new ReportLine(); if (reportLineItemDefinitions != null) { @@ -193,14 +204,4 @@ public class TaskMonitorServiceImpl implements TaskMonitorService { return reportLine; } - private Map createEmptyDetailLinesForWorkbaskets(List workbaskets, - List reportLineItemDefinitions) { - Map detailLines = new LinkedHashMap<>(); - for (Workbasket workbasket : workbaskets) { - ReportLine reportLine = createEmptyReportLine(reportLineItemDefinitions); - detailLines.put(workbasket.getKey(), reportLine); - } - return detailLines; - } - } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/Report.java b/lib/taskana-core/src/main/java/pro/taskana/model/Report.java index 0093d1c80..462aecdd2 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/Report.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/Report.java @@ -36,7 +36,8 @@ public class Report { this.sumLine = sumLine; } - public void generateSumLine() { + public void generateSumLine(ReportLine sumLine) { + this.sumLine = sumLine; int totalNumberOfTasks = 0; for (ReportLine reportLine : this.getDetailLines().values()) { Iterator reportLineItemIterator = reportLine.getLineItems().iterator(); @@ -48,7 +49,6 @@ public class Report { totalNumberOfTasks += reportLine.getTotalNumberOfTasks(); } this.sumLine.setTotalNumberOfTasks(totalNumberOfTasks); - } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/ReportLine.java b/lib/taskana-core/src/main/java/pro/taskana/model/ReportLine.java index cc88cd340..1f62127ef 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/ReportLine.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/ReportLine.java @@ -42,6 +42,5 @@ public class ReportLine { break; } } - } } diff --git a/lib/taskana-core/src/main/java/pro/taskana/model/ReportLineItemDefinition.java b/lib/taskana-core/src/main/java/pro/taskana/model/ReportLineItemDefinition.java index bb9fc6bda..b772dafbc 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/model/ReportLineItemDefinition.java +++ b/lib/taskana-core/src/main/java/pro/taskana/model/ReportLineItemDefinition.java @@ -1,43 +1,48 @@ -package pro.taskana.model; - -/** - * A ReportLineItemDefinition has a lower and an upper age limit which subdivide the count of tasks into different - * sections. Days in past are represented as negative values and days in the future are represented as positive values. - * To avoid tasks are counted multiple times or not be listed in the report, these reportLineItemDefinitions should not - * overlap and should not have gaps. If the ReportLineDefinition should represent a single day, lowerAgeLimit and - * upperAgeLimit have to be equal. - */ -public class ReportLineItemDefinition { - - private int lowerAgeLimit; - private int upperAgeLimit; - - public ReportLineItemDefinition() { - } - - public ReportLineItemDefinition(int ageInDays) { - this.lowerAgeLimit = ageInDays; - this.upperAgeLimit = ageInDays; - } - - public ReportLineItemDefinition(int lowerAgeLimit, int upperAgeLimit) { - this.lowerAgeLimit = lowerAgeLimit; - this.upperAgeLimit = upperAgeLimit; - } - - public int getLowerAgeLimit() { - return lowerAgeLimit; - } - - public void setLowerAgeLimit(int lowerAgeLimit) { - this.lowerAgeLimit = lowerAgeLimit; - } - - public int getUpperAgeLimit() { - return upperAgeLimit; - } - - public void setUpperAgeLimit(int upperAgeLimit) { - this.upperAgeLimit = upperAgeLimit; - } -} +package pro.taskana.model; + +/** + * A ReportLineItemDefinition has a lower and an upper age limit which subdivide the count of tasks into different + * sections. Days in past are represented as negative values and days in the future are represented as positive values. + * To avoid tasks are counted multiple times or not be listed in the report, these reportLineItemDefinitions should not + * overlap and should not have gaps. If the ReportLineDefinition should represent a single day, lowerAgeLimit and + * upperAgeLimit have to be equal. + */ +public class ReportLineItemDefinition { + + private int lowerAgeLimit; + private int upperAgeLimit; + + public ReportLineItemDefinition() { + } + + public ReportLineItemDefinition(int ageInDays) { + this.lowerAgeLimit = ageInDays; + this.upperAgeLimit = ageInDays; + } + + public ReportLineItemDefinition(int lowerAgeLimit, int upperAgeLimit) { + this.lowerAgeLimit = lowerAgeLimit; + this.upperAgeLimit = upperAgeLimit; + } + + public int getLowerAgeLimit() { + return lowerAgeLimit; + } + + public void setLowerAgeLimit(int lowerAgeLimit) { + this.lowerAgeLimit = lowerAgeLimit; + } + + public int getUpperAgeLimit() { + return upperAgeLimit; + } + + public void setUpperAgeLimit(int upperAgeLimit) { + this.upperAgeLimit = upperAgeLimit; + } + + @Override + public String toString() { + return "(" + this.lowerAgeLimit + "," + this.upperAgeLimit + ")"; + } +} diff --git a/lib/taskana-core/src/test/java/acceptance/task/ProvideCategoryReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java similarity index 87% rename from lib/taskana-core/src/test/java/acceptance/task/ProvideCategoryReportAccTest.java rename to lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java index 0255e3a8f..70dad8894 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/ProvideCategoryReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideCategoryReportAccTest.java @@ -1,4 +1,4 @@ -package acceptance.task; +package acceptance.monitoring; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -106,21 +106,25 @@ public class ProvideCategoryReportAccTest { + report.getSumLine().getLineItems().get(3).getNumberOfTasks() + report.getSumLine().getLineItems().get(4).getNumberOfTasks() + report.getSumLine().getLineItems().get(5).getNumberOfTasks() - + report.getSumLine().getLineItems().get(6).getNumberOfTasks(); + + report.getSumLine().getLineItems().get(6).getNumberOfTasks() + + report.getSumLine().getLineItems().get(7).getNumberOfTasks() + + report.getSumLine().getLineItems().get(8).getNumberOfTasks(); assertNotNull(report); + assertEquals(33, report.getDetailLines().get(categories.get(0)).getTotalNumberOfTasks()); assertEquals(7, report.getDetailLines().get(categories.get(1)).getTotalNumberOfTasks()); assertEquals(10, report.getDetailLines().get(categories.get(2)).getTotalNumberOfTasks()); - assertEquals(22, report.getSumLine().getLineItems().get(0).getNumberOfTasks()); - assertEquals(5, report.getSumLine().getLineItems().get(1).getNumberOfTasks()); - assertEquals(3, report.getSumLine().getLineItems().get(2).getNumberOfTasks()); - assertEquals(4, report.getSumLine().getLineItems().get(3).getNumberOfTasks()); - assertEquals(1, report.getSumLine().getLineItems().get(4).getNumberOfTasks()); - assertEquals(4, report.getSumLine().getLineItems().get(5).getNumberOfTasks()); - assertEquals(11, report.getSumLine().getLineItems().get(6).getNumberOfTasks()); - + assertEquals(11, report.getSumLine().getLineItems().get(0).getNumberOfTasks()); + assertEquals(8, report.getSumLine().getLineItems().get(1).getNumberOfTasks()); + assertEquals(11, report.getSumLine().getLineItems().get(2).getNumberOfTasks()); + assertEquals(0, report.getSumLine().getLineItems().get(3).getNumberOfTasks()); + assertEquals(4, report.getSumLine().getLineItems().get(4).getNumberOfTasks()); + assertEquals(0, report.getSumLine().getLineItems().get(5).getNumberOfTasks()); + assertEquals(7, report.getSumLine().getLineItems().get(6).getNumberOfTasks()); + assertEquals(4, report.getSumLine().getLineItems().get(7).getNumberOfTasks()); + assertEquals(5, report.getSumLine().getLineItems().get(8).getNumberOfTasks()); assertEquals(50, report.getSumLine().getTotalNumberOfTasks()); assertEquals(50, sumLineCount); @@ -162,13 +166,15 @@ public class ProvideCategoryReportAccTest { private List getListOfReportLineItemDefinitions() { List reportLineItemDefinitions = new ArrayList<>(); - reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -6)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -11)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-10, -6)); reportLineItemDefinitions.add(new ReportLineItemDefinition(-5, -2)); reportLineItemDefinitions.add(new ReportLineItemDefinition(-1)); reportLineItemDefinitions.add(new ReportLineItemDefinition(0)); reportLineItemDefinitions.add(new ReportLineItemDefinition(1)); reportLineItemDefinitions.add(new ReportLineItemDefinition(2, 5)); - reportLineItemDefinitions.add(new ReportLineItemDefinition(6, Integer.MAX_VALUE)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(6, 10)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(11, Integer.MAX_VALUE)); return reportLineItemDefinitions; } diff --git a/lib/taskana-core/src/test/java/acceptance/task/ProvideWorkbasketLevelReportAccTest.java b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java similarity index 86% rename from lib/taskana-core/src/test/java/acceptance/task/ProvideWorkbasketLevelReportAccTest.java rename to lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java index 7b29fbcd6..04237b4d8 100644 --- a/lib/taskana-core/src/test/java/acceptance/task/ProvideWorkbasketLevelReportAccTest.java +++ b/lib/taskana-core/src/test/java/acceptance/monitoring/ProvideWorkbasketLevelReportAccTest.java @@ -1,4 +1,4 @@ -package acceptance.task; +package acceptance.monitoring; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -13,7 +13,6 @@ import javax.sql.DataSource; import org.h2.store.fs.FileUtils; import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -79,7 +78,6 @@ public class ProvideWorkbasketLevelReportAccTest { assertEquals(20, report.getDetailLines().get(workbaskets.get(0).getKey()).getTotalNumberOfTasks()); assertEquals(20, report.getDetailLines().get(workbaskets.get(1).getKey()).getTotalNumberOfTasks()); assertEquals(10, report.getDetailLines().get(workbaskets.get(2).getKey()).getTotalNumberOfTasks()); - assertEquals(0, report.getDetailLines().get(workbaskets.get(3).getKey()).getTotalNumberOfTasks()); assertEquals(50, report.getSumLine().getTotalNumberOfTasks()); } @@ -103,23 +101,25 @@ public class ProvideWorkbasketLevelReportAccTest { + report.getSumLine().getLineItems().get(3).getNumberOfTasks() + report.getSumLine().getLineItems().get(4).getNumberOfTasks() + report.getSumLine().getLineItems().get(5).getNumberOfTasks() - + report.getSumLine().getLineItems().get(6).getNumberOfTasks(); + + report.getSumLine().getLineItems().get(6).getNumberOfTasks() + + report.getSumLine().getLineItems().get(7).getNumberOfTasks() + + report.getSumLine().getLineItems().get(8).getNumberOfTasks(); - Assert.assertNotNull(report); + assertNotNull(report); assertEquals(20, report.getDetailLines().get(workbaskets.get(0).getKey()).getTotalNumberOfTasks()); assertEquals(20, report.getDetailLines().get(workbaskets.get(1).getKey()).getTotalNumberOfTasks()); assertEquals(10, report.getDetailLines().get(workbaskets.get(2).getKey()).getTotalNumberOfTasks()); - assertEquals(0, report.getDetailLines().get(workbaskets.get(3).getKey()).getTotalNumberOfTasks()); - - assertEquals(22, report.getSumLine().getLineItems().get(0).getNumberOfTasks()); - assertEquals(5, report.getSumLine().getLineItems().get(1).getNumberOfTasks()); - assertEquals(3, report.getSumLine().getLineItems().get(2).getNumberOfTasks()); - assertEquals(4, report.getSumLine().getLineItems().get(3).getNumberOfTasks()); - assertEquals(1, report.getSumLine().getLineItems().get(4).getNumberOfTasks()); - assertEquals(4, report.getSumLine().getLineItems().get(5).getNumberOfTasks()); - assertEquals(11, report.getSumLine().getLineItems().get(6).getNumberOfTasks()); + assertEquals(11, report.getSumLine().getLineItems().get(0).getNumberOfTasks()); + assertEquals(8, report.getSumLine().getLineItems().get(1).getNumberOfTasks()); + assertEquals(11, report.getSumLine().getLineItems().get(2).getNumberOfTasks()); + assertEquals(0, report.getSumLine().getLineItems().get(3).getNumberOfTasks()); + assertEquals(4, report.getSumLine().getLineItems().get(4).getNumberOfTasks()); + assertEquals(0, report.getSumLine().getLineItems().get(5).getNumberOfTasks()); + assertEquals(7, report.getSumLine().getLineItems().get(6).getNumberOfTasks()); + assertEquals(4, report.getSumLine().getLineItems().get(7).getNumberOfTasks()); + assertEquals(5, report.getSumLine().getLineItems().get(8).getNumberOfTasks()); assertEquals(50, report.getSumLine().getTotalNumberOfTasks()); assertEquals(50, sumLineCount); @@ -140,7 +140,6 @@ public class ProvideWorkbasketLevelReportAccTest { Report report = taskMonitorService.getWorkbasketLevelReport(workbaskets, states); assertNotNull(report); - assertEquals(0, report.getDetailLines().get(workbaskets.get(0).getKey()).getTotalNumberOfTasks()); assertEquals(0, report.getSumLine().getTotalNumberOfTasks()); } @@ -161,13 +160,15 @@ public class ProvideWorkbasketLevelReportAccTest { private List getListOfReportLineItemDefinitions() { List reportLineItemDefinitions = new ArrayList<>(); - reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -6)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -11)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-10, -6)); reportLineItemDefinitions.add(new ReportLineItemDefinition(-5, -2)); reportLineItemDefinitions.add(new ReportLineItemDefinition(-1)); reportLineItemDefinitions.add(new ReportLineItemDefinition(0)); reportLineItemDefinitions.add(new ReportLineItemDefinition(1)); reportLineItemDefinitions.add(new ReportLineItemDefinition(2, 5)); - reportLineItemDefinitions.add(new ReportLineItemDefinition(6, Integer.MAX_VALUE)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(6, 10)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(11, Integer.MAX_VALUE)); return reportLineItemDefinitions; } diff --git a/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java b/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java index fa482370f..bf35d54f0 100644 --- a/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java +++ b/lib/taskana-core/src/test/java/pro/taskana/database/TestDataGenerator.java @@ -105,9 +105,9 @@ public class TestDataGenerator { StringBuilder sql = new StringBuilder(); String line; - List ages = Arrays.asList(-1500, -1200, -1000, -1000, -1000, -500, -500, -300, -200, -100, -50, -20, - -15, -15, -14, -13, -12, -10, -8, -6, -6, -6, -5, -5, -5, -5, -2, -1, -1, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 100, 150, 150, 1000, 10000, 100000); + List ages = Arrays.asList(-70000, -14000, -2800, -1400, -1400, -700, -700, -35, -28, -28, -15, -14, + -14, -14, -14, -14, -14, -14, -14, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, + 7, 14, 14, 14, 14, 21, 210, 210, 28000, 700000); int i = 0; while ((line = bufferedReader.readLine()) != null) { if (line.contains("dueDate")) { 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 new file mode 100644 index 000000000..fb676441f --- /dev/null +++ b/lib/taskana-core/src/test/java/pro/taskana/impl/DaysToWorkingDaysConverterTest.java @@ -0,0 +1,89 @@ +package pro.taskana.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import pro.taskana.model.ReportLineItemDefinition; + +/** + * Test for the DaysToWorkingDaysConverter. + */ +public class DaysToWorkingDaysConverterTest { + + @Test + public void testInitializeForDifferentReportLineItemDefinitions() { + DaysToWorkingDaysConverter instance1 = DaysToWorkingDaysConverter + .initialize(getShortListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 03)); + DaysToWorkingDaysConverter instance2 = DaysToWorkingDaysConverter + .initialize(getShortListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 03)); + DaysToWorkingDaysConverter instance3 = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 03)); + + assertEquals(instance1, instance2); + assertNotEquals(instance1, instance3); + } + + @Test + public void testInitializeForDifferentDates() { + DaysToWorkingDaysConverter instance1 = DaysToWorkingDaysConverter + .initialize(getShortListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 04)); + DaysToWorkingDaysConverter instance2 = DaysToWorkingDaysConverter + .initialize(getShortListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 05)); + + assertNotEquals(instance1, instance2); + } + + @Test + public void testConvertDaysToWorkingDays() { + DaysToWorkingDaysConverter instance = DaysToWorkingDaysConverter + .initialize(getLargeListOfReportLineItemDefinitions(), LocalDate.of(2018, 02, 06)); + + assertEquals(16, instance.convertDaysToWorkingDays(16)); + assertEquals(11, instance.convertDaysToWorkingDays(15)); + + assertEquals(-2, instance.convertDaysToWorkingDays(-4)); + assertEquals(-1, instance.convertDaysToWorkingDays(-3)); + assertEquals(-1, instance.convertDaysToWorkingDays(-2)); + assertEquals(-1, instance.convertDaysToWorkingDays(-1)); + assertEquals(0, instance.convertDaysToWorkingDays(0)); + assertEquals(1, instance.convertDaysToWorkingDays(1)); + assertEquals(2, instance.convertDaysToWorkingDays(2)); + assertEquals(3, instance.convertDaysToWorkingDays(3)); + assertEquals(3, instance.convertDaysToWorkingDays(4)); + assertEquals(3, instance.convertDaysToWorkingDays(5)); + assertEquals(4, instance.convertDaysToWorkingDays(6)); + + assertEquals(11, instance.convertDaysToWorkingDays(15)); + assertEquals(16, instance.convertDaysToWorkingDays(16)); + } + + private List getShortListOfReportLineItemDefinitions() { + List reportLineItemDefinitions = new ArrayList<>(); + reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -3)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-1, -2)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(0)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(1, 2)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(3, Integer.MAX_VALUE)); + return reportLineItemDefinitions; + } + + private List getLargeListOfReportLineItemDefinitions() { + List reportLineItemDefinitions = new ArrayList<>(); + reportLineItemDefinitions.add(new ReportLineItemDefinition(Integer.MIN_VALUE, -11)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-10, -6)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-5, -2)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(-1)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(0)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(1)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(2, 5)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(6, 10)); + reportLineItemDefinitions.add(new ReportLineItemDefinition(11, Integer.MAX_VALUE)); + return reportLineItemDefinitions; + } +}