TSK-1267: All TimeIntervalReports are now based on any TaskTimestamp

This commit is contained in:
Mustapha Zorgati 2020-07-21 07:10:26 +02:00
parent 83a79eab18
commit 97443641af
50 changed files with 648 additions and 1161 deletions

View File

@ -70,8 +70,7 @@ public class TaskanaHistoryEngineImpl implements TaskanaHistoryEngine {
.map(role -> getConfiguration().getRoleMap().get(role)) .map(role -> getConfiguration().getRoleMap().get(role))
.collect(HashSet::new, Set::addAll, Set::addAll); .collect(HashSet::new, Set::addAll, Set::addAll);
return CurrentUserContext.getAccessIds().stream() return CurrentUserContext.getAccessIds().stream().anyMatch(rolesMembers::contains);
.anyMatch(rolesMembers::contains);
} }
public void checkRoleMembership(TaskanaRole... roles) throws NotAuthorizedException { public void checkRoleMembership(TaskanaRole... roles) throws NotAuthorizedException {

View File

@ -53,13 +53,9 @@ class QueryHistoryAccTest extends AbstractAccTest {
.orderByCreated(SortDirection.DESCENDING); .orderByCreated(SortDirection.DESCENDING);
List<HistoryEventImpl> results = query.list(); List<HistoryEventImpl> results = query.list();
assertThat(results) assertThat(results).extracting(TaskanaHistoryEvent::getUserId).containsOnly("admin", "peter");
.extracting(TaskanaHistoryEvent::getUserId)
.containsOnly("admin", "peter");
results = query.orderByUserId(SortDirection.DESCENDING).list(); results = query.orderByUserId(SortDirection.DESCENDING).list();
assertThat(results) assertThat(results).extracting(TaskanaHistoryEvent::getUserId).containsOnly("admin", "peter");
.extracting(TaskanaHistoryEvent::getUserId)
.containsOnly("admin", "peter");
assertThat(query.domainLike().count()).isEqualTo(13); assertThat(query.domainLike().count()).isEqualTo(13);
} }

View File

@ -87,8 +87,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat
Invocation<T> invocation, Invocation<T> invocation,
ReflectiveInvocationContext<Method> invocationContext, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) { ExtensionContext extensionContext) {
WithAccessIds annotation = invocationContext.getExecutable().getAnnotation( WithAccessIds annotation = invocationContext.getExecutable().getAnnotation(WithAccessIds.class);
WithAccessIds.class);
if (annotation != null) { if (annotation != null) {
// our goal is to run each test returned from the test factory X times. X is the amount of // our goal is to run each test returned from the test factory X times. X is the amount of
// WithAccessId annotations. In order to achieve this we are wrapping the result from the // WithAccessId annotations. In order to achieve this we are wrapping the result from the
@ -236,8 +235,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat
private static <T> T extractAccessIdAndPerformInvocation( private static <T> T extractAccessIdAndPerformInvocation(
Invocation<T> invocation, AnnotatedElement executable) { Invocation<T> invocation, AnnotatedElement executable) {
return performInvocationWithAccessId(invocation, executable.getAnnotation( return performInvocationWithAccessId(invocation, executable.getAnnotation(WithAccessId.class));
WithAccessId.class));
} }
private static <T> T performInvocationWithAccessId( private static <T> T performInvocationWithAccessId(
@ -250,8 +248,7 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat
return Subject.doAs(subject, performInvocation); return Subject.doAs(subject, performInvocation);
} }
private static List<Principal> getPrincipals( private static List<Principal> getPrincipals(WithAccessId withAccessId) {
WithAccessId withAccessId) {
if (withAccessId != null) { if (withAccessId != null) {
return Stream.concat( return Stream.concat(
Stream.of(withAccessId.user()).map(UserPrincipal::new), Stream.of(withAccessId.user()).map(UserPrincipal::new),
@ -289,16 +286,14 @@ public class JaasExtension implements InvocationInterceptor, TestTemplateInvocat
return context.getStore(Namespace.create(getClass(), context.getRequiredTestMethod())); return context.getStore(Namespace.create(getClass(), context.getRequiredTestMethod()));
} }
private static String getDisplayNameForAccessId( private static String getDisplayNameForAccessId(WithAccessId withAccessId) {
WithAccessId withAccessId) {
return String.format("for user '%s'", withAccessId.user()); return String.format("for user '%s'", withAccessId.user());
} }
private static class JaasExtensionInvocationContext implements TestTemplateInvocationContext { private static class JaasExtensionInvocationContext implements TestTemplateInvocationContext {
private final WithAccessId withAccessId; private final WithAccessId withAccessId;
private JaasExtensionInvocationContext( private JaasExtensionInvocationContext(WithAccessId withAccessId) {
WithAccessId withAccessId) {
this.withAccessId = withAccessId; this.withAccessId = withAccessId;
} }

View File

@ -173,7 +173,9 @@ public class TaskHistoryEventControllerRestDocumentation {
this.mockMvc this.mockMvc
.perform( .perform(
RestDocumentationRequestBuilders.get( RestDocumentationRequestBuilders.get(
"http://127.0.0.1:" + port + "/api/v1/task-history-event/HEI:000000000000000000000000000000000000") "http://127.0.0.1:"
+ port
+ "/api/v1/task-history-event/HEI:000000000000000000000000000000000000")
.accept("application/hal+json") .accept("application/hal+json")
.header("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x")) .header("Authorization", "Basic dGVhbWxlYWRfMTp0ZWFtbGVhZF8x"))
.andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.status().isOk())

View File

@ -22,7 +22,7 @@ import pro.taskana.common.api.exceptions.SystemException;
* The WorkingDaysToDaysConverter provides a method to convert an age in working days into an age in * The WorkingDaysToDaysConverter provides a method to convert an age in working days into an age in
* days. * days.
*/ */
public final class WorkingDaysToDaysConverter { public class WorkingDaysToDaysConverter {
// offset in days from easter sunday // offset in days from easter sunday
private static final long OFFSET_GOOD_FRIDAY = -2; // Good Friday private static final long OFFSET_GOOD_FRIDAY = -2; // Good Friday

View File

@ -4,5 +4,4 @@ package pro.taskana.common.internal.util;
public interface CheckedBiConsumer<T, U, E extends Throwable> { public interface CheckedBiConsumer<T, U, E extends Throwable> {
void accept(T t, U u) throws E; void accept(T t, U u) throws E;
} }

View File

@ -1,6 +1,6 @@
package pro.taskana.monitor.api; package pro.taskana.monitor.api;
import pro.taskana.monitor.api.reports.CategoryReport; import pro.taskana.monitor.api.reports.ClassificationCategoryReport;
import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport;
import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport;
import pro.taskana.monitor.api.reports.TaskStatusReport; import pro.taskana.monitor.api.reports.TaskStatusReport;
@ -20,12 +20,13 @@ public interface MonitorService {
WorkbasketReport.Builder createWorkbasketReportBuilder(); WorkbasketReport.Builder createWorkbasketReportBuilder();
/** /**
* Provides a {@link CategoryReport.Builder} for creating a {@link CategoryReport}, list the task * Provides a {@link ClassificationCategoryReport.Builder} for creating a {@link
* ids of this report and list the values of an entered custom attribute. * ClassificationCategoryReport}, list the task ids of this report and list the values of an
* entered custom attribute.
* *
* @return a {@link CategoryReport.Builder} * @return a {@link ClassificationCategoryReport.Builder}
*/ */
CategoryReport.Builder createCategoryReportBuilder(); ClassificationCategoryReport.Builder createCategoryReportBuilder();
/** /**
* Provides a {@link ClassificationReport.Builder} for creating a {@link ClassificationReport} or * Provides a {@link ClassificationReport.Builder} for creating a {@link ClassificationReport} or

View File

@ -1,9 +1,9 @@
package pro.taskana.task.api; package pro.taskana.monitor.api;
import pro.taskana.task.api.models.Task; import pro.taskana.task.api.models.Task;
/** This enum contains all timestamps saved in the database table for a {@link Task}. */ /** This enum contains all timestamps saved in the database table for a {@link Task}. */
public enum Timestamp { public enum TaskTimestamp {
CREATED, CREATED,
CLAIMED, CLAIMED,
COMPLETED, COMPLETED,

View File

@ -4,6 +4,7 @@ import java.util.List;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -15,17 +16,23 @@ import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
* also the number of tasks of the respective cluster. The age of the tasks can be counted in days * also the number of tasks of the respective cluster. The age of the tasks can be counted in days
* or in working days. Tasks with Timestamp DUE = null are not considered. * or in working days. Tasks with Timestamp DUE = null are not considered.
*/ */
public class CategoryReport extends Report<MonitorQueryItem, TimeIntervalColumnHeader> { public class ClassificationCategoryReport
extends Report<MonitorQueryItem, TimeIntervalColumnHeader> {
public CategoryReport(List<TimeIntervalColumnHeader> timeIntervalColumnHeaders) { public ClassificationCategoryReport(List<TimeIntervalColumnHeader> timeIntervalColumnHeaders) {
super(timeIntervalColumnHeaders, new String[] {"CLASSIFICATION CATEGORIES"}); super(timeIntervalColumnHeaders, new String[] {"CLASSIFICATION CATEGORIES"});
} }
/** Builder for {@link CategoryReport}. */ /** Builder for {@link ClassificationCategoryReport}. */
public interface Builder public interface Builder
extends TimeIntervalReportBuilder<Builder, MonitorQueryItem, TimeIntervalColumnHeader> { extends TimeIntervalReportBuilder<Builder, MonitorQueryItem, TimeIntervalColumnHeader> {
@Override @Override
CategoryReport buildReport() throws NotAuthorizedException, InvalidArgumentException; ClassificationCategoryReport buildReport()
throws NotAuthorizedException, InvalidArgumentException;
@Override
ClassificationCategoryReport buildReport(TaskTimestamp timestamp)
throws NotAuthorizedException, InvalidArgumentException;
} }
} }

View File

@ -4,6 +4,7 @@ import java.util.List;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem; import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -28,6 +29,10 @@ public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalC
@Override @Override
ClassificationReport buildReport() throws NotAuthorizedException, InvalidArgumentException; ClassificationReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
@Override
ClassificationReport buildReport(TaskTimestamp timestamp)
throws NotAuthorizedException, InvalidArgumentException;
/** /**
* Returns a {@link DetailedClassificationReport} containing all tasks after applying the * Returns a {@link DetailedClassificationReport} containing all tasks after applying the
* filters. If the column headers are set the report is subdivided into clusters. Its {@link * filters. If the column headers are set the report is subdivided into clusters. Its {@link
@ -40,6 +45,9 @@ public class ClassificationReport extends Report<MonitorQueryItem, TimeIntervalC
*/ */
DetailedClassificationReport buildDetailedReport() DetailedClassificationReport buildDetailedReport()
throws InvalidArgumentException, NotAuthorizedException; throws InvalidArgumentException, NotAuthorizedException;
DetailedClassificationReport buildDetailedReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException;
} }
/** /**

View File

@ -4,6 +4,7 @@ import java.util.List;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -27,5 +28,9 @@ public class CustomFieldValueReport extends Report<MonitorQueryItem, TimeInterva
@Override @Override
CustomFieldValueReport buildReport() throws NotAuthorizedException, InvalidArgumentException; CustomFieldValueReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
@Override
CustomFieldValueReport buildReport(TaskTimestamp timestamp)
throws NotAuthorizedException, InvalidArgumentException;
} }
} }

View File

@ -27,10 +27,10 @@ import pro.taskana.monitor.api.reports.row.SingleRow;
*/ */
public abstract class Report<I extends QueryItem, H extends ColumnHeader<? super I>> { public abstract class Report<I extends QueryItem, H extends ColumnHeader<? super I>> {
private final Map<String, Row<I>> reportRows = new LinkedHashMap<>();
private final Row<I> sumRow;
private final String[] rowDesc;
protected List<H> columnHeaders; protected List<H> columnHeaders;
private Map<String, Row<I>> reportRows = new LinkedHashMap<>();
private Row<I> sumRow;
private String[] rowDesc;
protected Report(List<H> columnHeaders, String[] rowDesc) { protected Report(List<H> columnHeaders, String[] rowDesc) {
this.rowDesc = rowDesc; this.rowDesc = rowDesc;

View File

@ -6,6 +6,7 @@ import java.util.Map;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.AgeQueryItem; import pro.taskana.monitor.api.reports.item.AgeQueryItem;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
@ -59,13 +60,13 @@ public interface TimeIntervalReportBuilder<
B stateIn(List<TaskState> states); B stateIn(List<TaskState> states);
/** /**
* Adds a list of categories to the builder. The created report contains only tasks with a * Adds a list of classificationCategories to the builder. The created report contains only tasks
* category in this list. * with a category in this list.
* *
* @param categories a list of categories * @param classificationCategory a list of classificationCategories
* @return the TimeIntervalReportBuilder * @return the TimeIntervalReportBuilder
*/ */
B categoryIn(List<String> categories); B classificationCategoryIn(List<String> classificationCategory);
/** /**
* Adds a list of classificationIds to the builder. The created report contains only tasks with a * Adds a list of classificationIds to the builder. The created report contains only tasks with a
@ -123,4 +124,7 @@ public interface TimeIntervalReportBuilder<
*/ */
List<String> listCustomAttributeValuesForCustomAttributeName(CustomField customField) List<String> listCustomAttributeValuesForCustomAttributeName(CustomField customField)
throws NotAuthorizedException; throws NotAuthorizedException;
Report<I, H> buildReport(TaskTimestamp timestamp)
throws NotAuthorizedException, InvalidArgumentException;
} }

View File

@ -4,10 +4,10 @@ import java.util.List;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.TimestampQueryItem; import pro.taskana.monitor.api.reports.item.TimestampQueryItem;
import pro.taskana.monitor.api.reports.row.TimestampRow; import pro.taskana.monitor.api.reports.row.TimestampRow;
import pro.taskana.task.api.Timestamp;
/** A {@link TimestampReport} displays created and competed tasks for a specific dates. */ /** A {@link TimestampReport} displays created and competed tasks for a specific dates. */
public class TimestampReport extends Report<TimestampQueryItem, TimeIntervalColumnHeader> { public class TimestampReport extends Report<TimestampQueryItem, TimeIntervalColumnHeader> {
@ -35,6 +35,6 @@ public class TimestampReport extends Report<TimestampQueryItem, TimeIntervalColu
@Override @Override
TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException; TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
Builder withTimestamps(List<Timestamp> statuses); Builder withTimestamps(List<TaskTimestamp> statuses);
} }
} }

View File

@ -5,6 +5,7 @@ import java.util.List;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.monitor.api.CombinedClassificationFilter; import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -30,14 +31,8 @@ public class WorkbasketReport extends Report<MonitorQueryItem, TimeIntervalColum
@Override @Override
WorkbasketReport buildReport() throws NotAuthorizedException, InvalidArgumentException; WorkbasketReport buildReport() throws NotAuthorizedException, InvalidArgumentException;
/** @Override
* buildPlannedDateBasedReport is querying grouping by plannedDate instead of due date. WorkbasketReport buildReport(TaskTimestamp timestamp)
*
* @return the built workbasketReport
* @throws NotAuthorizedException when the current user is not authorized to perform this action
* @throws InvalidArgumentException when the arguments given to the builder do not match
*/
WorkbasketReport buildPlannedDateBasedReport()
throws NotAuthorizedException, InvalidArgumentException; throws NotAuthorizedException, InvalidArgumentException;
/** /**

View File

@ -1,14 +1,14 @@
package pro.taskana.monitor.api.reports.item; package pro.taskana.monitor.api.reports.item;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.TimestampReport; import pro.taskana.monitor.api.reports.TimestampReport;
import pro.taskana.task.api.Timestamp;
/** The TimestampQueryItem contains the necessary information for the {@link TimestampReport}. */ /** The TimestampQueryItem contains the necessary information for the {@link TimestampReport}. */
public class TimestampQueryItem implements AgeQueryItem { public class TimestampQueryItem implements AgeQueryItem {
private static final String N_A = "N/A"; private static final String N_A = "N/A";
private int count; private int count;
private Timestamp status; private TaskTimestamp status;
private int ageInDays; private int ageInDays;
private String orgLevel1; private String orgLevel1;
private String orgLevel2; private String orgLevel2;

View File

@ -9,13 +9,13 @@ import org.apache.ibatis.annotations.Select;
import pro.taskana.monitor.api.CombinedClassificationFilter; import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem; import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
import pro.taskana.monitor.api.reports.item.TaskQueryItem; import pro.taskana.monitor.api.reports.item.TaskQueryItem;
import pro.taskana.monitor.api.reports.item.TimestampQueryItem; import pro.taskana.monitor.api.reports.item.TimestampQueryItem;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
import pro.taskana.task.api.TaskState; import pro.taskana.task.api.TaskState;
import pro.taskana.task.api.Timestamp;
/** This class is the mybatis mapping of task monitoring. */ /** This class is the mybatis mapping of task monitoring. */
@SuppressWarnings({"checkstyle:LineLength", "checkstyle:Indentation"}) @SuppressWarnings({"checkstyle:LineLength", "checkstyle:Indentation"})
@ -24,9 +24,9 @@ public interface MonitorMapper {
@Select( @Select(
"<script>" "<script>"
+ "SELECT B.WORKBASKET_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" + "SELECT B.WORKBASKET_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT T.WORKBASKET_KEY, (DAYS(T.DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'db2'\">SELECT T.WORKBASKET_KEY, (DAYS(T.${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.DUE) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'h2'\">SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'postgres'\">SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID " + "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ "<where>" + "<where>"
+ "<if test=\"workbasketIds != null\">" + "<if test=\"workbasketIds != null\">"
@ -35,8 +35,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND T.STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND T.STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND T.CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND T.CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND T.DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND T.DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -69,66 +69,9 @@ public interface MonitorMapper {
List<MonitorQueryItem> getTaskCountOfWorkbaskets( List<MonitorQueryItem> getTaskCountOfWorkbaskets(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains,
@Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter,
@Param("combinedClassificationFilter")
List<CombinedClassificationFilter> combinedClassificationFilter);
@Select(
"<script>"
+ "SELECT B.WORKBASKET_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT T.WORKBASKET_KEY, (DAYS(T.PLANNED) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.WORKBASKET_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.PLANNED) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.WORKBASKET_KEY, DATE_PART('DAY', T.PLANNED - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ "<where>"
+ "<if test=\"workbasketIds != null\">"
+ "T.WORKBASKET_ID IN (<foreach collection='workbasketIds' item='workbasketId' separator=','>#{workbasketId}</foreach>) "
+ "</if>"
+ "<if test=\"states != null\">"
+ "AND T.STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>"
+ "<if test=\"categories != null\">"
+ "AND T.CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) "
+ "</if>"
+ "<if test=\"domains != null\">"
+ "AND T.DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
+ "</if>"
+ "<if test='classificationIds != null'>"
+ "AND CLASSIFICATION_ID IN (<foreach collection='classificationIds' item='classificationId' separator=','>#{classificationId}</foreach>) "
+ "</if>"
+ "<if test='excludedClassificationIds != null'>"
+ "AND CLASSIFICATION_ID NOT IN (<foreach collection='excludedClassificationIds' item='excludedClassificationId' separator=','>#{excludedClassificationId}</foreach>) "
+ "</if>"
+ "<if test='customAttributeFilter != null'>"
+ "AND (<foreach collection='customAttributeFilter.keys' item='key' separator=' AND '>(${key} = '${customAttributeFilter.get(key)}')</foreach>) "
+ "</if>"
+ "<if test=\"combinedClassificationFilter != null\">"
+ "AND <foreach collection='combinedClassificationFilter' item='item' separator='OR'> "
+ "T.CLASSIFICATION_ID = #{item.taskClassificationId}"
+ "<if test=\"item.attachmentClassificationId != null\">"
+ "AND A.CLASSIFICATION_ID = #{item.attachmentClassificationId}"
+ "</if>"
+ "</foreach>"
+ "</if>"
+ "AND T.PLANNED IS NOT NULL "
+ "</where>"
+ ") AS B "
+ "GROUP BY B.WORKBASKET_KEY, B.AGE_IN_DAYS"
+ "</script>")
@Results({
@Result(column = "WORKBASKET_KEY", property = "key"),
@Result(column = "AGE_IN_DAYS", property = "ageInDays"),
@Result(column = "NUMBER_OF_TASKS", property = "numberOfTasks")
})
List<MonitorQueryItem> getTaskCountOfWorkbasketsBasedOnPlannedDate(
@Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states,
@Param("categories") List<String> categories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("timestamp") TaskTimestamp timestamp,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter, @Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter,
@ -138,9 +81,9 @@ public interface MonitorMapper {
@Select( @Select(
"<script>" "<script>"
+ "SELECT B.CLASSIFICATION_CATEGORY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" + "SELECT B.CLASSIFICATION_CATEGORY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_CATEGORY, (DAYS(DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_CATEGORY, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_CATEGORY, DATEDIFF('DAY', CURRENT_TIMESTAMP, DUE) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_CATEGORY, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_CATEGORY, DATE_PART('DAY', DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_CATEGORY, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK " + "FROM TASK "
+ "<where>" + "<where>"
+ "<if test=\"workbasketIds != null\">" + "<if test=\"workbasketIds != null\">"
@ -149,8 +92,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -177,8 +120,9 @@ public interface MonitorMapper {
List<MonitorQueryItem> getTaskCountOfCategories( List<MonitorQueryItem> getTaskCountOfCategories(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("timestamp") TaskTimestamp timestamp,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter); @Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter);
@ -186,9 +130,9 @@ public interface MonitorMapper {
@Select( @Select(
"<script>" "<script>"
+ "SELECT B.CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" + "SELECT B.CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_KEY, (DAYS(DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'db2'\">SELECT CLASSIFICATION_KEY, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, DUE) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'h2'\">SELECT CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_KEY, DATE_PART('DAY', DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'postgres'\">SELECT CLASSIFICATION_KEY, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK " + "FROM TASK "
+ "<where>" + "<where>"
+ "<if test=\"workbasketIds != null\">" + "<if test=\"workbasketIds != null\">"
@ -197,8 +141,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -225,8 +169,9 @@ public interface MonitorMapper {
List<MonitorQueryItem> getTaskCountOfClassifications( List<MonitorQueryItem> getTaskCountOfClassifications(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("timestamp") TaskTimestamp timestamp,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter); @Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter);
@ -234,9 +179,9 @@ public interface MonitorMapper {
@Select( @Select(
"<script>" "<script>"
+ "SELECT B.TASK_CLASSIFICATION_KEY, B.ATTACHMENT_CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" + "SELECT B.TASK_CLASSIFICATION_KEY, B.ATTACHMENT_CLASSIFICATION_KEY, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, (DAYS(DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'db2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, (DAYS(T.${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, DUE) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'h2'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATEDIFF('DAY', CURRENT_TIMESTAMP, T.${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATE_PART('DAY', DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'postgres'\">SELECT T.CLASSIFICATION_KEY as TASK_CLASSIFICATION_KEY, A.CLASSIFICATION_KEY as ATTACHMENT_CLASSIFICATION_KEY, DATE_PART('DAY', T.${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID " + "FROM TASK AS T LEFT JOIN ATTACHMENT AS A ON T.ID = A.TASK_ID "
+ "<where>" + "<where>"
+ "<if test=\"workbasketIds != null\">" + "<if test=\"workbasketIds != null\">"
@ -245,8 +190,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -274,8 +219,9 @@ public interface MonitorMapper {
List<DetailedMonitorQueryItem> getTaskCountOfDetailedClassifications( List<DetailedMonitorQueryItem> getTaskCountOfDetailedClassifications(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("timestamp") TaskTimestamp timestamp,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter); @Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter);
@ -283,9 +229,9 @@ public interface MonitorMapper {
@Select( @Select(
"<script>" "<script>"
+ "SELECT B.CUSTOM_FIELD, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM (" + "SELECT B.CUSTOM_FIELD, B.AGE_IN_DAYS, COUNT(B.AGE_IN_DAYS) AS NUMBER_OF_TASKS FROM ("
+ "<if test=\"_databaseId == 'db2'\">SELECT ${customField} as CUSTOM_FIELD, (DAYS(DUE) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'db2'\">SELECT ${customField} as CUSTOM_FIELD, (DAYS(${timestamp}) - DAYS(CURRENT_TIMESTAMP)) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'h2'\">SELECT ${customField} as CUSTOM_FIELD, DATEDIFF('DAY', CURRENT_TIMESTAMP, DUE) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'h2'\">SELECT ${customField} as CUSTOM_FIELD, DATEDIFF('DAY', CURRENT_TIMESTAMP, ${timestamp}) as AGE_IN_DAYS </if> "
+ "<if test=\"_databaseId == 'postgres'\">SELECT ${customField} as CUSTOM_FIELD, DATE_PART('DAY', DUE - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> " + "<if test=\"_databaseId == 'postgres'\">SELECT ${customField} as CUSTOM_FIELD, DATE_PART('DAY', ${timestamp} - CURRENT_TIMESTAMP) as AGE_IN_DAYS </if> "
+ "FROM TASK " + "FROM TASK "
+ "<where>" + "<where>"
+ "<if test=\"workbasketIds != null\">" + "<if test=\"workbasketIds != null\">"
@ -294,8 +240,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -323,8 +269,9 @@ public interface MonitorMapper {
@Param("customField") CustomField customField, @Param("customField") CustomField customField,
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("timestamp") TaskTimestamp timestamp,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter); @Param("customAttributeFilter") Map<CustomField, String> customAttributeFilter);
@ -342,8 +289,8 @@ public interface MonitorMapper {
+ "<if test=\"states != null\">" + "<if test=\"states != null\">"
+ "AND T.STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND T.STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"categories != null\">" + "<if test=\"classificationCategories != null\">"
+ "AND T.CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND T.CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test=\"domains != null\">" + "<if test=\"domains != null\">"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -382,7 +329,7 @@ public interface MonitorMapper {
List<String> getTaskIdsForSelectedItems( List<String> getTaskIdsForSelectedItems(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@ -424,8 +371,8 @@ public interface MonitorMapper {
+ "<if test='states != null'>" + "<if test='states != null'>"
+ "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) " + "AND STATE IN (<foreach collection='states' item='state' separator=','>#{state}</foreach>) "
+ "</if>" + "</if>"
+ "<if test='categories != null'>" + "<if test='classificationCategories != null'>"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test='domains != null'>" + "<if test='domains != null'>"
+ "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) " + "AND DOMAIN IN (<foreach collection='domains' item='domain' separator=','>#{domain}</foreach>) "
@ -444,7 +391,7 @@ public interface MonitorMapper {
List<String> getCustomAttributeValuesForReport( List<String> getCustomAttributeValuesForReport(
@Param("workbasketIds") List<String> workbasketIds, @Param("workbasketIds") List<String> workbasketIds,
@Param("states") List<TaskState> states, @Param("states") List<TaskState> states,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@ -471,8 +418,8 @@ public interface MonitorMapper {
+ "<if test=\"status.name() == 'COMPLETED'\">" + "<if test=\"status.name() == 'COMPLETED'\">"
+ "T.COMPLETED IS NOT NULL" + "T.COMPLETED IS NOT NULL"
+ "</if>" + "</if>"
+ "<if test='categories != null'>" + "<if test='classificationCategories != null'>"
+ "AND CLASSIFICATION_CATEGORY IN (<foreach collection='categories' item='category' separator=','>#{category}</foreach>) " + "AND CLASSIFICATION_CATEGORY IN (<foreach collection='classificationCategories' item='category' separator=','>#{category}</foreach>) "
+ "</if>" + "</if>"
+ "<if test='classificationIds != null'>" + "<if test='classificationIds != null'>"
+ "AND CLASSIFICATION_ID IN (<foreach collection='classificationIds' item='classificationId' separator=','>#{classificationId}</foreach>) " + "AND CLASSIFICATION_ID IN (<foreach collection='classificationIds' item='classificationId' separator=','>#{classificationId}</foreach>) "
@ -500,8 +447,8 @@ public interface MonitorMapper {
@Result(column = "ORG_LEVEL_4", property = "orgLevel4") @Result(column = "ORG_LEVEL_4", property = "orgLevel4")
}) })
List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel( List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(
@Param("status") Timestamp status, @Param("status") TaskTimestamp status,
@Param("categories") List<String> categories, @Param("classificationCategories") List<String> classificationCategories,
@Param("classificationIds") List<String> classificationIds, @Param("classificationIds") List<String> classificationIds,
@Param("excludedClassificationIds") List<String> excludedClassificationIds, @Param("excludedClassificationIds") List<String> excludedClassificationIds,
@Param("domains") List<String> domains, @Param("domains") List<String> domains,

View File

@ -2,13 +2,13 @@ package pro.taskana.monitor.internal;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.reports.CategoryReport; import pro.taskana.monitor.api.reports.ClassificationCategoryReport;
import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport;
import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport;
import pro.taskana.monitor.api.reports.TaskStatusReport; import pro.taskana.monitor.api.reports.TaskStatusReport;
import pro.taskana.monitor.api.reports.TimestampReport; import pro.taskana.monitor.api.reports.TimestampReport;
import pro.taskana.monitor.api.reports.WorkbasketReport; import pro.taskana.monitor.api.reports.WorkbasketReport;
import pro.taskana.monitor.internal.reports.CategoryReportBuilderImpl; import pro.taskana.monitor.internal.reports.ClassificationCategoryReportBuilderImpl;
import pro.taskana.monitor.internal.reports.ClassificationReportBuilderImpl; import pro.taskana.monitor.internal.reports.ClassificationReportBuilderImpl;
import pro.taskana.monitor.internal.reports.CustomFieldValueReportBuilderImpl; import pro.taskana.monitor.internal.reports.CustomFieldValueReportBuilderImpl;
import pro.taskana.monitor.internal.reports.TaskStatusReportBuilderImpl; import pro.taskana.monitor.internal.reports.TaskStatusReportBuilderImpl;
@ -34,8 +34,8 @@ public class MonitorServiceImpl implements MonitorService {
} }
@Override @Override
public CategoryReport.Builder createCategoryReportBuilder() { public ClassificationCategoryReport.Builder createCategoryReportBuilder() {
return new CategoryReportBuilderImpl(taskanaEngine, monitorMapper); return new ClassificationCategoryReportBuilderImpl(taskanaEngine, monitorMapper);
} }
@Override @Override

View File

@ -8,38 +8,48 @@ import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.reports.CategoryReport; import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.CategoryReport.Builder; import pro.taskana.monitor.api.reports.ClassificationCategoryReport;
import pro.taskana.monitor.api.reports.ClassificationCategoryReport.Builder;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
import pro.taskana.monitor.internal.MonitorMapper; import pro.taskana.monitor.internal.MonitorMapper;
import pro.taskana.monitor.internal.preprocessor.DaysToWorkingDaysReportPreProcessor; import pro.taskana.monitor.internal.preprocessor.DaysToWorkingDaysReportPreProcessor;
/** The implementation of CategoryReportBuilder. */ /** The implementation of CategoryReportBuilder. */
public class CategoryReportBuilderImpl public class ClassificationCategoryReportBuilderImpl
extends TimeIntervalReportBuilderImpl<Builder, MonitorQueryItem, TimeIntervalColumnHeader> extends TimeIntervalReportBuilderImpl<Builder, MonitorQueryItem, TimeIntervalColumnHeader>
implements CategoryReport.Builder { implements ClassificationCategoryReport.Builder {
private static final Logger LOGGER = LoggerFactory.getLogger(CategoryReport.Builder.class); private static final Logger LOGGER =
LoggerFactory.getLogger(ClassificationCategoryReportBuilderImpl.class);
public CategoryReportBuilderImpl( public ClassificationCategoryReportBuilderImpl(
InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) { InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) {
super(taskanaEngine, monitorMapper); super(taskanaEngine, monitorMapper);
} }
@Override @Override
public CategoryReport buildReport() throws InvalidArgumentException, NotAuthorizedException { public ClassificationCategoryReport buildReport()
throws NotAuthorizedException, InvalidArgumentException {
return buildReport(TaskTimestamp.DUE);
}
@Override
public ClassificationCategoryReport buildReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException {
LOGGER.debug("entry to buildReport(), this = {}", this); LOGGER.debug("entry to buildReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR);
try { try {
this.taskanaEngine.openConnection(); this.taskanaEngine.openConnection();
CategoryReport report = new CategoryReport(this.columnHeaders); ClassificationCategoryReport report = new ClassificationCategoryReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems = List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfCategories( this.monitorMapper.getTaskCountOfCategories(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
timestamp,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
this.customAttributeFilter); this.customAttributeFilter);
@ -55,7 +65,7 @@ public class CategoryReportBuilderImpl
} }
@Override @Override
protected CategoryReport.Builder _this() { protected ClassificationCategoryReport.Builder _this() {
return this; return this;
} }

View File

@ -8,6 +8,7 @@ import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport;
import pro.taskana.monitor.api.reports.ClassificationReport.Builder; import pro.taskana.monitor.api.reports.ClassificationReport.Builder;
import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport;
@ -22,7 +23,8 @@ public class ClassificationReportBuilderImpl
extends TimeIntervalReportBuilderImpl<Builder, MonitorQueryItem, TimeIntervalColumnHeader> extends TimeIntervalReportBuilderImpl<Builder, MonitorQueryItem, TimeIntervalColumnHeader>
implements ClassificationReport.Builder { implements ClassificationReport.Builder {
private static final Logger LOGGER = LoggerFactory.getLogger(ClassificationReport.Builder.class); private static final Logger LOGGER =
LoggerFactory.getLogger(ClassificationReportBuilderImpl.class);
public ClassificationReportBuilderImpl( public ClassificationReportBuilderImpl(
InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) { InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) {
@ -31,6 +33,12 @@ public class ClassificationReportBuilderImpl
@Override @Override
public ClassificationReport buildReport() public ClassificationReport buildReport()
throws NotAuthorizedException, InvalidArgumentException {
return buildReport(TaskTimestamp.DUE);
}
@Override
public ClassificationReport buildReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException { throws InvalidArgumentException, NotAuthorizedException {
LOGGER.debug("entry to buildReport(), this = {}", this); LOGGER.debug("entry to buildReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
@ -41,8 +49,9 @@ public class ClassificationReportBuilderImpl
this.monitorMapper.getTaskCountOfClassifications( this.monitorMapper.getTaskCountOfClassifications(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
timestamp,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
this.customAttributeFilter); this.customAttributeFilter);
@ -60,6 +69,12 @@ public class ClassificationReportBuilderImpl
@Override @Override
public DetailedClassificationReport buildDetailedReport() public DetailedClassificationReport buildDetailedReport()
throws InvalidArgumentException, NotAuthorizedException { throws InvalidArgumentException, NotAuthorizedException {
return buildDetailedReport(TaskTimestamp.DUE);
}
@Override
public DetailedClassificationReport buildDetailedReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException {
LOGGER.debug("entry to buildDetailedReport(), this = {}", this); LOGGER.debug("entry to buildDetailedReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
try { try {
@ -69,8 +84,9 @@ public class ClassificationReportBuilderImpl
this.monitorMapper.getTaskCountOfDetailedClassifications( this.monitorMapper.getTaskCountOfDetailedClassifications(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
timestamp,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
this.customAttributeFilter); this.customAttributeFilter);

View File

@ -8,6 +8,7 @@ import pro.taskana.common.api.TaskanaRole;
import pro.taskana.common.api.exceptions.InvalidArgumentException; import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport;
import pro.taskana.monitor.api.reports.CustomFieldValueReport.Builder; import pro.taskana.monitor.api.reports.CustomFieldValueReport.Builder;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
@ -24,7 +25,7 @@ public class CustomFieldValueReportBuilderImpl
private static final Logger LOGGER = private static final Logger LOGGER =
LoggerFactory.getLogger(CustomFieldValueReportBuilderImpl.class); LoggerFactory.getLogger(CustomFieldValueReportBuilderImpl.class);
private CustomField customField; private final CustomField customField;
public CustomFieldValueReportBuilderImpl( public CustomFieldValueReportBuilderImpl(
InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper, CustomField customField) { InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper, CustomField customField) {
@ -34,6 +35,12 @@ public class CustomFieldValueReportBuilderImpl
@Override @Override
public CustomFieldValueReport buildReport() public CustomFieldValueReport buildReport()
throws NotAuthorizedException, InvalidArgumentException {
return buildReport(TaskTimestamp.DUE);
}
@Override
public CustomFieldValueReport buildReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException { throws InvalidArgumentException, NotAuthorizedException {
LOGGER.debug("entry to buildReport(customField = {}), this = {}", this.customField, this); LOGGER.debug("entry to buildReport(customField = {}), this = {}", this.customField, this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR);
@ -45,8 +52,9 @@ public class CustomFieldValueReportBuilderImpl
this.customField, this.customField,
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
timestamp,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
this.customAttributeFilter); this.customAttributeFilter);

View File

@ -44,7 +44,7 @@ abstract class TimeIntervalReportBuilderImpl<
protected boolean inWorkingDays; protected boolean inWorkingDays;
protected List<String> workbasketIds; protected List<String> workbasketIds;
protected List<TaskState> states; protected List<TaskState> states;
protected List<String> categories; protected List<String> classificationCategory;
protected List<String> domains; protected List<String> domains;
protected List<String> classificationIds; protected List<String> classificationIds;
protected List<String> excludedClassificationIds; protected List<String> excludedClassificationIds;
@ -83,8 +83,8 @@ abstract class TimeIntervalReportBuilderImpl<
} }
@Override @Override
public B categoryIn(List<String> categories) { public B classificationCategoryIn(List<String> classificationCategory) {
this.categories = new ArrayList<>(categories); this.classificationCategory = new ArrayList<>(classificationCategory);
return _this(); return _this();
} }
@ -141,7 +141,7 @@ abstract class TimeIntervalReportBuilderImpl<
return this.monitorMapper.getTaskIdsForSelectedItems( return this.monitorMapper.getTaskIdsForSelectedItems(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
@ -168,7 +168,7 @@ abstract class TimeIntervalReportBuilderImpl<
return monitorMapper.getCustomAttributeValuesForReport( return monitorMapper.getCustomAttributeValuesForReport(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,

View File

@ -13,6 +13,8 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.Report;
import pro.taskana.monitor.api.reports.TimestampReport; import pro.taskana.monitor.api.reports.TimestampReport;
import pro.taskana.monitor.api.reports.TimestampReport.Builder; import pro.taskana.monitor.api.reports.TimestampReport.Builder;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
@ -20,15 +22,15 @@ import pro.taskana.monitor.api.reports.item.TimestampQueryItem;
import pro.taskana.monitor.internal.MonitorMapper; import pro.taskana.monitor.internal.MonitorMapper;
import pro.taskana.monitor.internal.preprocessor.DaysToWorkingDaysReportPreProcessor; import pro.taskana.monitor.internal.preprocessor.DaysToWorkingDaysReportPreProcessor;
import pro.taskana.task.api.TaskState; import pro.taskana.task.api.TaskState;
import pro.taskana.task.api.Timestamp;
/** The implementation of {@link TimestampReport.Builder}. */ /** The implementation of {@link TimestampReport.Builder}. */
public class TimestampReportBuilderImpl public class TimestampReportBuilderImpl
extends TimeIntervalReportBuilderImpl<Builder, TimestampQueryItem, TimeIntervalColumnHeader> extends TimeIntervalReportBuilderImpl<Builder, TimestampQueryItem, TimeIntervalColumnHeader>
implements TimestampReport.Builder { implements TimestampReport.Builder {
private static final Logger LOGGER = LoggerFactory.getLogger(TimestampReport.Builder.class); private static final Logger LOGGER = LoggerFactory.getLogger(TimestampReportBuilderImpl.class);
private List<Timestamp> status = Arrays.asList(Timestamp.CREATED, Timestamp.COMPLETED); private List<TaskTimestamp> status =
Arrays.asList(TaskTimestamp.CREATED, TaskTimestamp.COMPLETED);
public TimestampReportBuilderImpl( public TimestampReportBuilderImpl(
InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) { InternalTaskanaEngine taskanaEngine, MonitorMapper monitorMapper) {
@ -47,33 +49,36 @@ public class TimestampReportBuilderImpl
} }
@Override @Override
public TimestampReport.Builder withTimestamps(List<Timestamp> statuses) { public TimestampReport.Builder withTimestamps(List<TaskTimestamp> statuses) {
this.status = new ArrayList<>(statuses); this.status = new ArrayList<>(statuses);
return _this(); return _this();
} }
@Override
public Report<TimestampQueryItem, TimeIntervalColumnHeader> buildReport(TaskTimestamp timestamp)
throws NotAuthorizedException, InvalidArgumentException {
return buildReport();
}
@Override @Override
public TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException { public TimestampReport buildReport() throws NotAuthorizedException, InvalidArgumentException {
LOGGER.debug("entry to buildDetailedReport(), this = {}", this); LOGGER.debug("entry to buildDetailedReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
try { try {
this.taskanaEngine.openConnection(); this.taskanaEngine.openConnection();
TimestampReport report = new TimestampReport(this.columnHeaders); TimestampReport report = new TimestampReport(columnHeaders);
List<TimestampQueryItem> items = List<TimestampQueryItem> items =
status.stream() status.stream()
// This can also be implemented into a single sql query which combines all statuses // This can also be implemented into a single sql query which combines all statuses
// with the union // with the union operator. That would reduce the readability of the sql template.
// operator. That would reduce the readability of the sql template. That's why "the // That's why "the loop" is done outside of mybatis.
// loop" is done
// outside of mybatis.
.map(this::getTasksCountForStatusGroupedByOrgLevel) .map(this::getTasksCountForStatusGroupedByOrgLevel)
.flatMap(Collection::stream) .flatMap(Collection::stream)
.collect(Collectors.toList()); .collect(Collectors.toList());
report.addItems( report.addItems(
items, items,
new DaysToWorkingDaysReportPreProcessor<>( new DaysToWorkingDaysReportPreProcessor<>(columnHeaders, converter, inWorkingDays));
this.columnHeaders, converter, this.inWorkingDays));
return report; return report;
} finally { } finally {
this.taskanaEngine.returnConnection(); this.taskanaEngine.returnConnection();
@ -91,10 +96,10 @@ public class TimestampReportBuilderImpl
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
private List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(Timestamp s) { private List<TimestampQueryItem> getTasksCountForStatusGroupedByOrgLevel(TaskTimestamp s) {
return monitorMapper.getTasksCountForStatusGroupedByOrgLevel( return monitorMapper.getTasksCountForStatusGroupedByOrgLevel(
s, s,
categories, classificationCategory,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
domains, domains,

View File

@ -9,6 +9,7 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.CombinedClassificationFilter; import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.WorkbasketReport; import pro.taskana.monitor.api.reports.WorkbasketReport;
import pro.taskana.monitor.api.reports.WorkbasketReport.Builder; import pro.taskana.monitor.api.reports.WorkbasketReport.Builder;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
@ -30,7 +31,13 @@ public class WorkbasketReportBuilderImpl
} }
@Override @Override
public WorkbasketReport buildReport() throws InvalidArgumentException, NotAuthorizedException { public WorkbasketReport buildReport() throws NotAuthorizedException, InvalidArgumentException {
return buildReport(TaskTimestamp.DUE);
}
@Override
public WorkbasketReport buildReport(TaskTimestamp timestamp)
throws InvalidArgumentException, NotAuthorizedException {
LOGGER.debug("entry to buildReport(), this = {}", this); LOGGER.debug("entry to buildReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN); this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
try { try {
@ -40,8 +47,9 @@ public class WorkbasketReportBuilderImpl
this.monitorMapper.getTaskCountOfWorkbaskets( this.monitorMapper.getTaskCountOfWorkbaskets(
this.workbasketIds, this.workbasketIds,
this.states, this.states,
this.categories, this.classificationCategory,
this.domains, this.domains,
timestamp,
this.classificationIds, this.classificationIds,
this.excludedClassificationIds, this.excludedClassificationIds,
this.customAttributeFilter, this.customAttributeFilter,
@ -57,35 +65,6 @@ public class WorkbasketReportBuilderImpl
} }
} }
@Override
public WorkbasketReport buildPlannedDateBasedReport()
throws NotAuthorizedException, InvalidArgumentException {
LOGGER.debug("entry to buildPlannedDateReport(), this = {}", this);
this.taskanaEngine.getEngine().checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
try {
this.taskanaEngine.openConnection();
WorkbasketReport report = new WorkbasketReport(this.columnHeaders);
List<MonitorQueryItem> monitorQueryItems =
this.monitorMapper.getTaskCountOfWorkbasketsBasedOnPlannedDate(
this.workbasketIds,
this.states,
this.categories,
this.domains,
this.classificationIds,
this.excludedClassificationIds,
this.customAttributeFilter,
this.combinedClassificationFilter);
report.addItems(
monitorQueryItems,
new DaysToWorkingDaysReportPreProcessor<>(
this.columnHeaders, converter, this.inWorkingDays));
return report;
} finally {
this.taskanaEngine.returnConnection();
LOGGER.debug("exit from buildPlannedDateReport().");
}
}
@Override @Override
public WorkbasketReport.Builder combinedClassificationFilterIn( public WorkbasketReport.Builder combinedClassificationFilterIn(
List<CombinedClassificationFilter> combinedClassificationFilter) { List<CombinedClassificationFilter> combinedClassificationFilter) {

View File

@ -12,9 +12,7 @@ import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.spi.history.api.TaskanaHistory; import pro.taskana.spi.history.api.TaskanaHistory;
import pro.taskana.spi.history.api.events.TaskanaHistoryEvent; import pro.taskana.spi.history.api.events.TaskanaHistoryEvent;
/** /** Creates and deletes events and emits them to the registered history service providers. */
* Creates and deletes events and emits them to the registered history service providers.
*/
public final class HistoryEventManager { public final class HistoryEventManager {
private static final Logger LOGGER = LoggerFactory.getLogger(HistoryEventManager.class); private static final Logger LOGGER = LoggerFactory.getLogger(HistoryEventManager.class);
@ -53,7 +51,8 @@ public final class HistoryEventManager {
public void deleteEvents(List<String> taskIds) { public void deleteEvents(List<String> taskIds) {
LOGGER.debug("Sending taskIds to history service providers: {}", taskIds); LOGGER.debug("Sending taskIds to history service providers: {}", taskIds);
serviceLoader.forEach(historyProvider -> { serviceLoader.forEach(
historyProvider -> {
try { try {
historyProvider.deleteHistoryEventsByTaskIds(taskIds); historyProvider.deleteHistoryEventsByTaskIds(taskIds);
} catch (InvalidArgumentException | NotAuthorizedException e) { } catch (InvalidArgumentException | NotAuthorizedException e) {

View File

@ -337,7 +337,6 @@ public interface TaskQueryMapper {
+ "</if>" + "</if>"
+ "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">" + "<if test=\"addAttachmentClassificationNameToSelectClauseForOrdering\">"
+ ", ACNAME " + ", ACNAME "
+ "</if>" + "</if>"
+ ", FLAG ) " + ", FLAG ) "
+ "AS " + "AS "

View File

@ -9,14 +9,11 @@ import pro.taskana.common.internal.TaskanaEngineTestConfiguration;
import pro.taskana.sampledata.SampleDataGenerator; import pro.taskana.sampledata.SampleDataGenerator;
/** Abstract test class for all report building tests. */ /** Abstract test class for all report building tests. */
public class AbstractReportAccTest { public abstract class AbstractReportAccTest {
protected static TaskanaEngineConfiguration taskanaEngineConfiguration; protected static TaskanaEngineConfiguration taskanaEngineConfiguration;
protected static TaskanaEngine taskanaEngine; protected static TaskanaEngine taskanaEngine;
// checkstyle needs this constructor, since this is only a "utility" class
protected AbstractReportAccTest() {}
protected static void resetDb() throws Exception { protected static void resetDb() throws Exception {
DataSource dataSource = TaskanaEngineTestConfiguration.getDataSource(); DataSource dataSource = TaskanaEngineTestConfiguration.getDataSource();
String schemaName = TaskanaEngineTestConfiguration.getSchemaName(); String schemaName = TaskanaEngineTestConfiguration.getSchemaName();

View File

@ -25,7 +25,7 @@ import pro.taskana.task.api.TaskState;
/** Acceptance test for all "get task ids of category report" scenarios. */ /** Acceptance test for all "get task ids of category report" scenarios. */
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class GetTaskIdsOfCategoryReportAccTest extends AbstractReportAccTest { class GetTaskIdsOfClassificationCategoryReportAccTest extends AbstractReportAccTest {
@Test @Test
void testRoleCheck() { void testRoleCheck() {
@ -211,7 +211,7 @@ class GetTaskIdsOfCategoryReportAccTest extends AbstractReportAccTest {
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.categoryIn(categories) .classificationCategoryIn(categories)
.listTaskIdsForSelectedItems(selectedItems); .listTaskIdsForSelectedItems(selectedItems);
assertThat(ids) assertThat(ids)

View File

@ -211,7 +211,7 @@ class GetTaskIdsOfCustomFieldValueReportAccTest extends AbstractReportAccTest {
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.categoryIn(categories) .classificationCategoryIn(categories)
.listTaskIdsForSelectedItems(selectedItems); .listTaskIdsForSelectedItems(selectedItems);
assertThat(ids).hasSize(3); assertThat(ids).hasSize(3);

View File

@ -1,60 +1,51 @@
package acceptance.report; package acceptance.report;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.IntStream; import java.util.stream.Stream;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.reports.CategoryReport; import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationCategoryReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
import pro.taskana.task.api.TaskState; import pro.taskana.task.api.TaskState;
/** Acceptance test for all "category report" scenarios. */ /** Acceptance test for all "category report" scenarios. */
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideCategoryReportAccTest extends AbstractReportAccTest { class ProvideClassificationCategoryReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER = LoggerFactory.getLogger(ProvideCategoryReportAccTest.class); private static final MonitorService MONITOR_SERVICE = taskanaEngine.getMonitorService();
@Test @Test
void testRoleCheck() { void testRoleCheck() {
MonitorService monitorService = taskanaEngine.getMonitorService(); assertThatThrownBy(() -> MONITOR_SERVICE.createCategoryReportBuilder().buildReport())
.isInstanceOf(NotAuthorizedException.class);
// Assertions.assertThrows(
// NotAuthorizedException.class,
// () -> monitorService.createCategoryReportBuilder().buildReport());
ThrowingCallable call =
() -> {
monitorService.createCategoryReportBuilder().buildReport();
};
assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfCategoryReport() throws Exception { void testGetTotalNumbersOfTasksOfCategoryReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService(); ClassificationCategoryReport report =
MONITOR_SERVICE.createCategoryReportBuilder().buildReport();
CategoryReport report = monitorService.createCategoryReportBuilder().buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -62,32 +53,24 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
assertThat(report.getRow("EXTERN").getTotalValue()).isEqualTo(33); assertThat(report.getRow("EXTERN").getTotalValue()).isEqualTo(33);
assertThat(report.getRow("AUTOMATIC").getTotalValue()).isEqualTo(7); assertThat(report.getRow("AUTOMATIC").getTotalValue()).isEqualTo(7);
assertThat(report.getRow("MANUAL").getTotalValue()).isEqualTo(10); assertThat(report.getRow("MANUAL").getTotalValue()).isEqualTo(10);
assertThat(report.getRow("EXTERN").getCells().length).isEqualTo(0); assertThat(report.getRow("EXTERN").getCells()).isEmpty();
assertThat(report.getRow("AUTOMATIC").getCells().length).isEqualTo(0); assertThat(report.getRow("AUTOMATIC").getCells()).isEmpty();
assertThat(report.getRow("MANUAL").getCells().length).isEqualTo(0); assertThat(report.getRow("MANUAL").getCells()).isEmpty();
assertThat(report.getSumRow().getTotalValue()).isEqualTo(50); assertThat(report.getSumRow().getTotalValue()).isEqualTo(50);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetCategoryReportWithReportLineItemDefinitions() throws Exception { void testGetCategoryReportWithReportLineItemDefinitions() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
final int sumLineCount = IntStream.of(report.getSumRow().getCells()).sum();
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -98,27 +81,20 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
int[] sumRow = report.getSumRow().getCells(); int[] sumRow = report.getSumRow().getCells();
assertThat(sumRow).isEqualTo(new int[] {10, 9, 11, 0, 4, 0, 7, 4, 5}); assertThat(sumRow).isEqualTo(new int[] {10, 9, 11, 0, 4, 0, 7, 4, 5});
assertThat(report.getSumRow().getTotalValue()).isEqualTo(50); assertThat(report.getSumRow().getTotalValue()).isEqualTo(50);
assertThat(sumLineCount).isEqualTo(50);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReport() throws Exception { void testEachItemOfCategoryReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -133,19 +109,54 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @TestFactory
void testEachItemOfCategoryReportNotInWorkingDays() throws Exception { Stream<DynamicTest> should_NotThrowError_When_buildReportForTaskState() {
MonitorService monitorService = taskanaEngine.getMonitorService(); Iterator<TaskTimestamp> iterator = Arrays.stream(TaskTimestamp.values()).iterator();
ThrowingConsumer<TaskTimestamp> test =
timestamp -> {
ThrowingCallable callable =
() -> MONITOR_SERVICE.createCategoryReportBuilder().buildReport(timestamp);
assertThatCode(callable).doesNotThrowAnyException();
};
return DynamicTest.stream(iterator, t -> "for TaskState " + t, test);
}
@WithAccessId(user = "monitor")
@Test
void should_computeNumbersAccordingToPlannedDate_When_BuildReportForPlanned() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService.createCategoryReportBuilder().withColumnHeaders(columnHeaders).buildReport(); MONITOR_SERVICE
.createCategoryReportBuilder()
.withColumnHeaders(columnHeaders)
.inWorkingDays()
.buildReport(TaskTimestamp.PLANNED);
if (LOGGER.isDebugEnabled()) { assertThat(report).isNotNull();
LOGGER.debug(reportToString(report, columnHeaders)); assertThat(report.rowSize()).isEqualTo(3);
int[] row1 = report.getRow("EXTERN").getCells();
assertThat(row1).isEqualTo(new int[] {0, 3, 30, 0, 0});
int[] row2 = report.getRow("AUTOMATIC").getCells();
assertThat(row2).isEqualTo(new int[] {0, 0, 7, 0, 0});
int[] row3 = report.getRow("MANUAL").getCells();
assertThat(row3).isEqualTo(new int[] {0, 0, 10, 0, 0});
} }
@WithAccessId(user = "monitor")
@Test
void testEachItemOfCategoryReportNotInWorkingDays() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationCategoryReport report =
MONITOR_SERVICE
.createCategoryReportBuilder()
.withColumnHeaders(columnHeaders)
.buildReport();
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -162,24 +173,18 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReportWithWorkbasketFilter() throws Exception { void testEachItemOfCategoryReportWithWorkbasketFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> workbasketIds = List<String> workbasketIds =
Collections.singletonList("WBI:000000000000000000000000000000000001"); Collections.singletonList("WBI:000000000000000000000000000000000001");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -196,23 +201,17 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReportWithStateFilter() throws Exception { void testEachItemOfCategoryReportWithStateFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TaskState> states = Collections.singletonList(TaskState.READY); List<TaskState> states = Collections.singletonList(TaskState.READY);
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.stateIn(states) .stateIn(states)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -229,23 +228,17 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReportWithCategoryFilter() throws Exception { void testEachItemOfCategoryReportWithCategoryFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL"); List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.categoryIn(categories) .classificationCategoryIn(categories)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(2); assertThat(report.rowSize()).isEqualTo(2);
@ -259,23 +252,17 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReportWithDomainFilter() throws Exception { void testEachItemOfCategoryReportWithDomainFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> domains = Collections.singletonList("DOMAIN_A"); List<String> domains = Collections.singletonList("DOMAIN_A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.domainIn(domains) .domainIn(domains)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -292,24 +279,18 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCategoryReportWithCustomFieldValueFilter() throws Exception { void testEachItemOfCategoryReportWithCustomFieldValueFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
Map<CustomField, String> customAttributeFilter = new HashMap<>(); Map<CustomField, String> customAttributeFilter = new HashMap<>();
customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A"); customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CategoryReport report = ClassificationCategoryReport report =
monitorService MONITOR_SERVICE
.createCategoryReportBuilder() .createCategoryReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -346,75 +327,4 @@ class ProvideCategoryReportAccTest extends AbstractReportAccTest {
columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE)); columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE));
return columnHeaders; return columnHeaders;
} }
private String reportToString(CategoryReport report) {
return reportToString(report, null);
}
private String reportToString(
CategoryReport report, List<TimeIntervalColumnHeader> columnHeaders) {
final String formatColumWidth = "| %-7s ";
final String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth = columnHeaders == null ? 46 : columnHeaders.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(String.format(formatFirstColumnFirstLine, "Categories", "Total"));
if (columnHeaders != null) {
for (TimeIntervalColumnHeader def : columnHeaders) {
if (def.getLowerAgeLimit() == Integer.MIN_VALUE) {
builder.append(String.format(formatColumWidth, "< " + def.getUpperAgeLimit()));
} else if (def.getUpperAgeLimit() == Integer.MAX_VALUE) {
builder.append(String.format(formatColumWidth, "> " + def.getLowerAgeLimit()));
} else if (def.getLowerAgeLimit() == def.getUpperAgeLimit()) {
if (def.getLowerAgeLimit() == 0) {
builder.append(String.format(formatColumWidth, "today"));
} else {
builder.append(String.format(formatColumWidth, def.getLowerAgeLimit()));
}
} else {
builder.append(
String.format(
formatColumWidth, def.getLowerAgeLimit() + ".." + def.getUpperAgeLimit()));
}
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
if (columnHeaders != null) {
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -1,25 +1,29 @@
package acceptance.report; package acceptance.report;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.IntStream; import java.util.stream.Stream;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
@ -29,30 +33,18 @@ import pro.taskana.task.api.TaskState;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideClassificationReportAccTest extends AbstractReportAccTest { class ProvideClassificationReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER = private static final MonitorService MONITOR_SERVICE = taskanaEngine.getMonitorService();
LoggerFactory.getLogger(ProvideClassificationReportAccTest.class);
@Test @Test
void testRoleCheck() { void testRoleCheck() {
MonitorService monitorService = taskanaEngine.getMonitorService(); assertThatThrownBy(() -> MONITOR_SERVICE.createClassificationReportBuilder().buildReport())
.isInstanceOf(NotAuthorizedException.class);
ThrowingCallable call =
() -> {
monitorService.createClassificationReportBuilder().buildReport();
};
assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfClassificationReport() throws Exception { void testGetTotalNumbersOfTasksOfClassificationReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService(); ClassificationReport report = MONITOR_SERVICE.createClassificationReportBuilder().buildReport();
ClassificationReport report = monitorService.createClassificationReportBuilder().buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -73,23 +65,15 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetClassificationReportWithReportLineItemDefinitions() throws Exception { void testGetClassificationReportWithReportLineItemDefinitions() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnsHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnsHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
final int sumLineCount = IntStream.of(report.getSumRow().getCells()).sum();
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -99,37 +83,22 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
assertThat(report.getRow("L40000").getTotalValue()).isEqualTo(10); assertThat(report.getRow("L40000").getTotalValue()).isEqualTo(10);
assertThat(report.getRow("L50000").getTotalValue()).isEqualTo(13); assertThat(report.getRow("L50000").getTotalValue()).isEqualTo(13);
assertThat(report.getSumRow().getCells()[0]).isEqualTo(10); assertThat(report.getSumRow().getCells()).isEqualTo(new int[] {10, 9, 11, 0, 4, 0, 7, 4, 5});
assertThat(report.getSumRow().getCells()[1]).isEqualTo(9);
assertThat(report.getSumRow().getCells()[2]).isEqualTo(11);
assertThat(report.getSumRow().getCells()[3]).isEqualTo(0);
assertThat(report.getSumRow().getCells()[4]).isEqualTo(4);
assertThat(report.getSumRow().getCells()[5]).isEqualTo(0);
assertThat(report.getSumRow().getCells()[6]).isEqualTo(7);
assertThat(report.getSumRow().getCells()[7]).isEqualTo(4);
assertThat(report.getSumRow().getCells()[8]).isEqualTo(5);
assertThat(report.getSumRow().getTotalValue()).isEqualTo(50); assertThat(report.getSumRow().getTotalValue()).isEqualTo(50);
assertThat(sumLineCount).isEqualTo(50);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReport() throws Exception { void testEachItemOfClassificationReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -150,22 +119,60 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @TestFactory
void testEachItemOfClassificationReportNotInWorkingDays() throws Exception { Stream<DynamicTest> should_NotThrowError_When_buildReportForTaskState() {
MonitorService monitorService = taskanaEngine.getMonitorService(); Iterator<TaskTimestamp> iterator = Arrays.stream(TaskTimestamp.values()).iterator();
ThrowingConsumer<TaskTimestamp> test =
timestamp -> {
ThrowingCallable callable =
() -> MONITOR_SERVICE.createClassificationReportBuilder().buildReport(timestamp);
assertThatCode(callable).doesNotThrowAnyException();
};
return DynamicTest.stream(iterator, t -> "for TaskState " + t, test);
}
@WithAccessId(user = "monitor")
@Test
void should_computeNumbersAccordingToPlannedDate_When_BuildReportForPlanned() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder()
.withColumnHeaders(columnHeaders)
.inWorkingDays()
.buildReport(TaskTimestamp.PLANNED);
assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5);
int[] row1 = report.getRow("L10000").getCells();
assertThat(row1).isEqualTo(new int[] {0, 2, 8, 0, 0});
int[] row2 = report.getRow("L20000").getCells();
assertThat(row2).isEqualTo(new int[] {0, 1, 9, 0, 0});
int[] row3 = report.getRow("L30000").getCells();
assertThat(row3).isEqualTo(new int[] {0, 0, 7, 0, 0});
int[] row4 = report.getRow("L40000").getCells();
assertThat(row4).isEqualTo(new int[] {0, 0, 10, 0, 0});
int[] row5 = report.getRow("L50000").getCells();
assertThat(row5).isEqualTo(new int[] {0, 0, 13, 0, 0});
}
@WithAccessId(user = "monitor")
@Test
void testEachItemOfClassificationReportNotInWorkingDays() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report =
MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -188,24 +195,18 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReportWithWorkbasketFilter() throws Exception { void testEachItemOfClassificationReportWithWorkbasketFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> workbasketIds = List<String> workbasketIds =
Collections.singletonList("WBI:000000000000000000000000000000000001"); Collections.singletonList("WBI:000000000000000000000000000000000001");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -228,23 +229,17 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReportWithStateFilter() throws Exception { void testEachItemOfClassificationReportWithStateFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TaskState> states = Collections.singletonList(TaskState.READY); List<TaskState> states = Collections.singletonList(TaskState.READY);
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.stateIn(states) .stateIn(states)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -267,23 +262,17 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReportWithCategoryFilter() throws Exception { void testEachItemOfClassificationReportWithCategoryFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL"); List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.categoryIn(categories) .classificationCategoryIn(categories)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(2); assertThat(report.rowSize()).isEqualTo(2);
@ -297,23 +286,17 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReportWithDomainFilter() throws Exception { void testEachItemOfClassificationReportWithDomainFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> domains = Collections.singletonList("DOMAIN_A"); List<String> domains = Collections.singletonList("DOMAIN_A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.domainIn(domains) .domainIn(domains)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -336,24 +319,18 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfClassificationReportWithCustomFieldValueFilter() throws Exception { void testEachItemOfClassificationReportWithCustomFieldValueFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
Map<CustomField, String> customAttributeFilter = new HashMap<>(); Map<CustomField, String> customAttributeFilter = new HashMap<>();
customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A"); customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
ClassificationReport report = ClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -396,75 +373,4 @@ class ProvideClassificationReportAccTest extends AbstractReportAccTest {
reportLineItemDefinitions.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE)); reportLineItemDefinitions.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE));
return reportLineItemDefinitions; return reportLineItemDefinitions;
} }
private String reportToString(ClassificationReport report) {
return reportToString(report, null);
}
private String reportToString(
ClassificationReport report, List<TimeIntervalColumnHeader> columnHeaders) {
final String formatColumWidth = "| %-7s ";
final String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth = columnHeaders == null ? 46 : columnHeaders.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(String.format(formatFirstColumnFirstLine, "Classifications", "Total"));
if (columnHeaders != null) {
for (TimeIntervalColumnHeader def : columnHeaders) {
if (def.getLowerAgeLimit() == Integer.MIN_VALUE) {
builder.append(String.format(formatColumWidth, "< " + def.getUpperAgeLimit()));
} else if (def.getUpperAgeLimit() == Integer.MAX_VALUE) {
builder.append(String.format(formatColumWidth, "> " + def.getLowerAgeLimit()));
} else if (def.getLowerAgeLimit() == def.getUpperAgeLimit()) {
if (def.getLowerAgeLimit() == 0) {
builder.append(String.format(formatColumWidth, "today"));
} else {
builder.append(String.format(formatColumWidth, def.getLowerAgeLimit()));
}
} else {
builder.append(
String.format(
formatColumWidth, def.getLowerAgeLimit() + ".." + def.getUpperAgeLimit()));
}
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
if (columnHeaders != null) {
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -1,24 +1,29 @@
package acceptance.report; package acceptance.report;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
@ -28,16 +33,13 @@ import pro.taskana.task.api.TaskState;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest { class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER = private static final MonitorService MONITOR_SERVICE = taskanaEngine.getMonitorService();
LoggerFactory.getLogger(ProvideCustomFieldValueReportAccTest.class);
@Test @Test
void testRoleCheck() { void testRoleCheck() {
MonitorService monitorService = taskanaEngine.getMonitorService();
ThrowingCallable call = ThrowingCallable call =
() -> { () -> {
monitorService.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1).buildReport(); MONITOR_SERVICE.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1).buildReport();
}; };
assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class); assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class);
} }
@ -45,14 +47,8 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfCustomFieldValueReportForCustom1() throws Exception { void testGetTotalNumbersOfTasksOfCustomFieldValueReportForCustom1() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1).buildReport(); MONITOR_SERVICE.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1).buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -70,14 +66,8 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfCustomFieldValueReportForCustom2() throws Exception { void testGetTotalNumbersOfTasksOfCustomFieldValueReportForCustom2() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService.createCustomFieldValueReportBuilder(CustomField.CUSTOM_2).buildReport(); MONITOR_SERVICE.createCustomFieldValueReportBuilder(CustomField.CUSTOM_2).buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(2); assertThat(report.rowSize()).isEqualTo(2);
@ -94,22 +84,16 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetCustomFieldValueReportWithReportLineItemDefinitions() throws Exception { void testGetCustomFieldValueReportWithReportLineItemDefinitions() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
CustomField customField = CustomField.CUSTOM_1; CustomField customField = CustomField.CUSTOM_1;
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(customField) .createCustomFieldValueReportBuilder(customField)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -122,24 +106,34 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
assertThat(report.getSumRow().getTotalValue()).isEqualTo(50); assertThat(report.getSumRow().getTotalValue()).isEqualTo(50);
} }
@WithAccessId(user = "monitor")
@TestFactory
Stream<DynamicTest> should_NotThrowError_When_buildReportForTaskState() {
Iterator<TaskTimestamp> iterator = Arrays.stream(TaskTimestamp.values()).iterator();
ThrowingConsumer<TaskTimestamp> test =
timestamp -> {
ThrowingCallable callable =
() ->
MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.buildReport(timestamp);
assertThatCode(callable).doesNotThrowAnyException();
};
return DynamicTest.stream(iterator, t -> "for TaskState " + t, test);
}
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReport() throws Exception { void testEachItemOfCustomFieldValueReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -155,21 +149,40 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportNotInWorkingDays() throws Exception { void should_computeNumbersAccordingToPlannedDate_When_BuildReportForPlanned() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders)
.inWorkingDays()
.buildReport(TaskTimestamp.PLANNED);
assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3);
int[] row1 = report.getRow("Geschaeftsstelle A").getCells();
assertThat(row1).isEqualTo(new int[] {0, 1, 24, 0, 0});
int[] row2 = report.getRow("Geschaeftsstelle B").getCells();
assertThat(row2).isEqualTo(new int[] {0, 1, 9, 0, 0});
int[] row3 = report.getRow("Geschaeftsstelle C").getCells();
assertThat(row3).isEqualTo(new int[] {0, 1, 14, 0, 0});
}
@WithAccessId(user = "monitor")
@Test
void testEachItemOfCustomFieldValueReportNotInWorkingDays() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report =
MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -186,24 +199,18 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportWithWorkbasketFilter() throws Exception { void testEachItemOfCustomFieldValueReportWithWorkbasketFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> workbasketIds = List<String> workbasketIds =
Collections.singletonList("WBI:000000000000000000000000000000000001"); Collections.singletonList("WBI:000000000000000000000000000000000001");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -220,23 +227,17 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportWithStateFilter() throws Exception { void testEachItemOfCustomFieldValueReportWithStateFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TaskState> states = Collections.singletonList(TaskState.READY); List<TaskState> states = Collections.singletonList(TaskState.READY);
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.stateIn(states) .stateIn(states)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -253,23 +254,17 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportWithCategoryFilter() throws Exception { void testEachItemOfCustomFieldValueReportWithCategoryFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL"); List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.categoryIn(categories) .classificationCategoryIn(categories)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -286,23 +281,17 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportWithDomainFilter() throws Exception { void testEachItemOfCustomFieldValueReportWithDomainFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> domains = Collections.singletonList("DOMAIN_A"); List<String> domains = Collections.singletonList("DOMAIN_A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.domainIn(domains) .domainIn(domains)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -319,24 +308,18 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfCustomFieldValueReportWithCustomFieldValueFilter() throws Exception { void testEachItemOfCustomFieldValueReportWithCustomFieldValueFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
Map<CustomField, String> customAttributeFilter = new HashMap<>(); Map<CustomField, String> customAttributeFilter = new HashMap<>();
customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A"); customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
CustomFieldValueReport report = CustomFieldValueReport report =
monitorService MONITOR_SERVICE
.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) .createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(1); assertThat(report.rowSize()).isEqualTo(1);
@ -367,75 +350,4 @@ class ProvideCustomFieldValueReportAccTest extends AbstractReportAccTest {
columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE)); columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE));
return columnHeaders; return columnHeaders;
} }
private String reportToString(CustomFieldValueReport report) {
return reportToString(report, null);
}
private String reportToString(
CustomFieldValueReport report, List<TimeIntervalColumnHeader> columnHeaders) {
String formatColumWidth = "| %-7s ";
String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth = columnHeaders == null ? 46 : columnHeaders.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(String.format(formatFirstColumnFirstLine, "Custom field values", "Total"));
if (columnHeaders != null) {
for (TimeIntervalColumnHeader def : columnHeaders) {
if (def.getLowerAgeLimit() == Integer.MIN_VALUE) {
builder.append(String.format(formatColumWidth, "< " + def.getUpperAgeLimit()));
} else if (def.getUpperAgeLimit() == Integer.MAX_VALUE) {
builder.append(String.format(formatColumWidth, "> " + def.getLowerAgeLimit()));
} else if (def.getLowerAgeLimit() == def.getUpperAgeLimit()) {
if (def.getLowerAgeLimit() == 0) {
builder.append(String.format(formatColumWidth, "today"));
} else {
builder.append(String.format(formatColumWidth, def.getLowerAgeLimit()));
}
} else {
builder.append(
String.format(
formatColumWidth, def.getLowerAgeLimit() + ".." + def.getUpperAgeLimit()));
}
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
if (columnHeaders != null) {
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -1,24 +1,29 @@
package acceptance.report; package acceptance.report;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem; import pro.taskana.monitor.api.reports.item.DetailedMonitorQueryItem;
@ -31,31 +36,20 @@ import pro.taskana.task.api.TaskState;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest { class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER = private static final MonitorService MONITOR_SERVICE = taskanaEngine.getMonitorService();
LoggerFactory.getLogger(ProvideDetailedClassificationReportAccTest.class);
@Test @Test
void testRoleCheck() { void testRoleCheck() {
MonitorService monitorService = taskanaEngine.getMonitorService();
ThrowingCallable call = ThrowingCallable call =
() -> { () -> MONITOR_SERVICE.createClassificationReportBuilder().buildDetailedReport();
monitorService.createClassificationReportBuilder().buildDetailedReport();
};
assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class); assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfDetailedClassificationReport() throws Exception { void testGetTotalNumbersOfTasksOfDetailedClassificationReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService.createClassificationReportBuilder().buildDetailedReport(); MONITOR_SERVICE.createClassificationReportBuilder().buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -100,21 +94,15 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetDetailedClassificationReportWithReportLineItemDefinitions() throws Exception { void testGetDetailedClassificationReportWithReportLineItemDefinitions() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -129,24 +117,34 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
assertThat(report.getSumRow().getTotalValue()).isEqualTo(50); assertThat(report.getSumRow().getTotalValue()).isEqualTo(50);
} }
@WithAccessId(user = "monitor")
@TestFactory
Stream<DynamicTest> should_NotThrowError_When_buildReportForTaskState() {
Iterator<TaskTimestamp> iterator = Arrays.stream(TaskTimestamp.values()).iterator();
ThrowingConsumer<TaskTimestamp> test =
timestamp -> {
ThrowingCallable callable =
() ->
MONITOR_SERVICE
.createClassificationReportBuilder()
.buildDetailedReport(timestamp);
assertThatCode(callable).doesNotThrowAnyException();
};
return DynamicTest.stream(iterator, t -> "for TaskState " + t, test);
}
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReport() throws Exception { void testEachItemOfDetailedClassificationReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -195,25 +193,77 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportWithWorkbasketFilter() throws Exception { void should_computeNumbersAccordingToPlannedDate_When_BuildReportForPlanned() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report =
MONITOR_SERVICE
.createClassificationReportBuilder()
.inWorkingDays()
.withColumnHeaders(columnHeaders)
.buildDetailedReport(TaskTimestamp.PLANNED);
assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5);
FoldableRow<DetailedMonitorQueryItem> line1 = report.getRow("L10000");
assertThat(line1.getCells()).isEqualTo(new int[] {0, 2, 8, 0, 0});
Row<DetailedMonitorQueryItem> detailedLine1 = line1.getFoldableRow("L11000");
assertThat(detailedLine1.getCells()).isEqualTo(new int[] {0, 1, 2, 0, 0});
Row<DetailedMonitorQueryItem> detailedLineNoAttachment1 = line1.getFoldableRow("N/A");
assertThat(detailedLineNoAttachment1.getCells()).isEqualTo(new int[] {0, 1, 6, 0, 0});
FoldableRow<DetailedMonitorQueryItem> line2 = report.getRow("L20000");
assertThat(line2.getCells()).isEqualTo(new int[] {0, 1, 9, 0, 0});
Row<DetailedMonitorQueryItem> detailedLine2 = line2.getFoldableRow("L22000");
assertThat(detailedLine2.getCells()).isEqualTo(new int[] {0, 0, 4, 0, 0});
Row<DetailedMonitorQueryItem> detailedLineNoAttachment2 = line2.getFoldableRow("N/A");
assertThat(detailedLineNoAttachment2.getCells()).isEqualTo(new int[] {0, 1, 5, 0, 0});
FoldableRow<DetailedMonitorQueryItem> line3 = report.getRow("L30000");
assertThat(line3.getCells()).isEqualTo(new int[] {0, 0, 7, 0, 0});
Row<DetailedMonitorQueryItem> detailedLine3a = line3.getFoldableRow("L33000");
assertThat(detailedLine3a.getCells()).isEqualTo(new int[] {0, 0, 3, 0, 0});
Row<DetailedMonitorQueryItem> detailedLine3b = line3.getFoldableRow("L99000");
assertThat(detailedLine3b.getCells()).isEqualTo(new int[] {0, 0, 1, 0, 0});
Row<DetailedMonitorQueryItem> detailedLineNoAttachment3 = line3.getFoldableRow("N/A");
assertThat(detailedLineNoAttachment3.getCells()).isEqualTo(new int[] {0, 0, 3, 0, 0});
FoldableRow<DetailedMonitorQueryItem> line4 = report.getRow("L40000");
assertThat(line4.getCells()).isEqualTo(new int[] {0, 0, 10, 0, 0});
Row<DetailedMonitorQueryItem> detailedLineNoAttachment4 = line4.getFoldableRow("N/A");
assertThat(detailedLineNoAttachment4.getCells()).isEqualTo(new int[] {0, 0, 10, 0, 0});
FoldableRow<DetailedMonitorQueryItem> line5 = report.getRow("L50000");
assertThat(line5.getCells()).isEqualTo(new int[] {0, 0, 13, 0, 0});
Row<DetailedMonitorQueryItem> detailedLineNoAttachment5 = line5.getFoldableRow("N/A");
assertThat(detailedLineNoAttachment5.getCells()).isEqualTo(new int[] {0, 0, 13, 0, 0});
}
@WithAccessId(user = "monitor")
@Test
void testEachItemOfDetailedClassificationReportWithWorkbasketFilter() throws Exception {
List<String> workbasketIds = List<String> workbasketIds =
Collections.singletonList("WBI:000000000000000000000000000000000001"); Collections.singletonList("WBI:000000000000000000000000000000000001");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -260,23 +310,17 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportWithStateFilter() throws Exception { void testEachItemOfDetailedClassificationReportWithStateFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TaskState> states = Collections.singletonList(TaskState.READY); List<TaskState> states = Collections.singletonList(TaskState.READY);
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.stateIn(states) .stateIn(states)
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -323,20 +367,14 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportNotInWorkingDays() throws Exception { void testEachItemOfDetailedClassificationReportNotInWorkingDays() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -386,23 +424,17 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportWithCategoryFilter() throws Exception { void testEachItemOfDetailedClassificationReportWithCategoryFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL"); List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.categoryIn(categories) .classificationCategoryIn(categories)
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(2); assertThat(report.rowSize()).isEqualTo(2);
@ -428,23 +460,17 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportWithDomainFilter() throws Exception { void testEachItemOfDetailedClassificationReportWithDomainFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> domains = Collections.singletonList("DOMAIN_A"); List<String> domains = Collections.singletonList("DOMAIN_A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.domainIn(domains) .domainIn(domains)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -491,24 +517,18 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfDetailedClassificationReportWithCustomFieldValueFilter() throws Exception { void testEachItemOfDetailedClassificationReportWithCustomFieldValueFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
Map<CustomField, String> customAttributeFilter = new HashMap<>(); Map<CustomField, String> customAttributeFilter = new HashMap<>();
customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A"); customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
DetailedClassificationReport report = DetailedClassificationReport report =
monitorService MONITOR_SERVICE
.createClassificationReportBuilder() .createClassificationReportBuilder()
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.inWorkingDays() .inWorkingDays()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildDetailedReport(); .buildDetailedReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(5); assertThat(report.rowSize()).isEqualTo(5);
@ -575,86 +595,4 @@ class ProvideDetailedClassificationReportAccTest extends AbstractReportAccTest {
columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE)); columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE));
return columnHeaders; return columnHeaders;
} }
private String reportToString(DetailedClassificationReport report) {
return reportToString(report, null);
}
private String reportToString(
DetailedClassificationReport report, List<TimeIntervalColumnHeader> columnHeaders) {
String formatColumWidth = "| %-7s ";
String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnDetailLines = "| + %-34s %-4s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth = columnHeaders == null ? 46 : columnHeaders.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(
String.format(formatFirstColumnFirstLine, "Classifications + Attachments", "Total"));
if (columnHeaders != null) {
for (TimeIntervalColumnHeader def : columnHeaders) {
if (def.getLowerAgeLimit() == Integer.MIN_VALUE) {
builder.append(String.format(formatColumWidth, "< " + def.getUpperAgeLimit()));
} else if (def.getUpperAgeLimit() == Integer.MAX_VALUE) {
builder.append(String.format(formatColumWidth, "> " + def.getLowerAgeLimit()));
} else if (def.getLowerAgeLimit() == def.getUpperAgeLimit()) {
if (def.getLowerAgeLimit() == 0) {
builder.append(String.format(formatColumWidth, "today"));
} else {
builder.append(String.format(formatColumWidth, def.getLowerAgeLimit()));
}
} else {
builder.append(
String.format(
formatColumWidth, def.getLowerAgeLimit() + ".." + def.getUpperAgeLimit()));
}
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
if (columnHeaders != null) {
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
}
builder.append("|\n");
for (String detaileLine : report.getRow(rl).getFoldableRowKeySet()) {
Row<DetailedMonitorQueryItem> reportLine = report.getRow(rl).getFoldableRow(detaileLine);
builder.append(
String.format(formatFirstColumnDetailLines, detaileLine, reportLine.getTotalValue()));
for (int cell : reportLine.getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
}
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -7,20 +7,16 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.TestTemplate;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.reports.TaskStatusReport; import pro.taskana.monitor.api.reports.TaskStatusReport;
import pro.taskana.monitor.api.reports.header.TaskStatusColumnHeader;
import pro.taskana.monitor.api.reports.item.TaskQueryItem; import pro.taskana.monitor.api.reports.item.TaskQueryItem;
import pro.taskana.monitor.api.reports.row.Row; import pro.taskana.monitor.api.reports.row.Row;
import pro.taskana.task.api.TaskService; import pro.taskana.task.api.TaskService;
@ -30,9 +26,6 @@ import pro.taskana.task.api.TaskState;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideTaskStatusReportAccTest extends AbstractReportAccTest { class ProvideTaskStatusReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER =
LoggerFactory.getLogger(ProvideWorkbasketReportAccTest.class);
MonitorService monitorService = taskanaEngine.getMonitorService(); MonitorService monitorService = taskanaEngine.getMonitorService();
@BeforeEach @BeforeEach
@ -69,9 +62,6 @@ class ProvideTaskStatusReportAccTest extends AbstractReportAccTest {
void testCompleteTaskStatusReport() throws Exception { void testCompleteTaskStatusReport() throws Exception {
TaskStatusReport report = monitorService.createTaskStatusReportBuilder().buildReport(); TaskStatusReport report = monitorService.createTaskStatusReportBuilder().buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -101,9 +91,6 @@ class ProvideTaskStatusReportAccTest extends AbstractReportAccTest {
.domainIn(asList("DOMAIN_C", "DOMAIN_A")) .domainIn(asList("DOMAIN_C", "DOMAIN_A"))
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(2); assertThat(report.rowSize()).isEqualTo(2);
@ -129,9 +116,6 @@ class ProvideTaskStatusReportAccTest extends AbstractReportAccTest {
.stateIn(Collections.singletonList(TaskState.READY)) .stateIn(Collections.singletonList(TaskState.READY))
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -177,53 +161,4 @@ class ProvideTaskStatusReportAccTest extends AbstractReportAccTest {
assertThat(summaryNumbers[3]).isEqualTo(2); // number of cancelled tasks assertThat(summaryNumbers[3]).isEqualTo(2); // number of cancelled tasks
assertThat(summaryNumbers[4]).isEqualTo(3); // number of terminated tasks assertThat(summaryNumbers[4]).isEqualTo(3); // number of terminated tasks
} }
private String reportToString(TaskStatusReport report) {
List<TaskStatusColumnHeader> columnHeaders = report.getColumnHeaders();
String formatColumnWidth = "| %-7s ";
String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth = columnHeaders.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(String.format(formatFirstColumnFirstLine, "Domain", "Total"));
for (TaskStatusColumnHeader def : columnHeaders) {
builder.append(String.format(formatColumnWidth, def.getDisplayName()));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumnWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumnWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -51,8 +51,7 @@ class ProvideTimestampReportAccTest extends AbstractReportAccTest {
assertThat(timestampReport.getRows().keySet()) assertThat(timestampReport.getRows().keySet())
.isEqualTo(new HashSet<>(Arrays.asList("CREATED", "COMPLETED"))); .isEqualTo(new HashSet<>(Arrays.asList("CREATED", "COMPLETED")));
// * * * * * * * * * * * * * * * * * * * * * TEST THE CREATED ROW * * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * TEST THE CREATED ROW * * * * * * * * * * * * * * * * * *
// * * * * * * *
TimestampRow statusRow = timestampReport.getRow("CREATED"); TimestampRow statusRow = timestampReport.getRow("CREATED");
assertThat(statusRow.getFoldableRowCount()).isEqualTo(2); assertThat(statusRow.getFoldableRowCount()).isEqualTo(2);
@ -123,8 +122,7 @@ class ProvideTimestampReportAccTest extends AbstractReportAccTest {
assertThat(org4Row.getCells()).isEqualTo(org3Row.getCells()); assertThat(org4Row.getCells()).isEqualTo(org3Row.getCells());
assertThat(org4Row.getTotalValue()).isEqualTo(org3Row.getTotalValue()); assertThat(org4Row.getTotalValue()).isEqualTo(org3Row.getTotalValue());
// * * * * * * * * * * * * * * * * * * * * * TEST THE COMPLETED ROW * * * * * * * * * * * * * // * * * * * * * * * * * * * * * * * * TEST THE COMPLETED ROW * * * * * * * * * * * * * * * * *
// * * * * * * * *
statusRow = timestampReport.getRow("COMPLETED"); statusRow = timestampReport.getRow("COMPLETED");
assertThat(statusRow.getFoldableRowCount()).isEqualTo(2); assertThat(statusRow.getFoldableRowCount()).isEqualTo(2);

View File

@ -1,26 +1,31 @@
package acceptance.report; package acceptance.report;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.assertj.core.api.ThrowableAssert.ThrowingCallable; import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger; import org.junit.jupiter.api.function.ThrowingConsumer;
import org.slf4j.LoggerFactory;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.internal.security.JaasExtension; import pro.taskana.common.internal.security.JaasExtension;
import pro.taskana.common.internal.security.WithAccessId; import pro.taskana.common.internal.security.WithAccessId;
import pro.taskana.monitor.api.CombinedClassificationFilter; import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.WorkbasketReport; import pro.taskana.monitor.api.reports.WorkbasketReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
@ -30,29 +35,18 @@ import pro.taskana.task.api.TaskState;
@ExtendWith(JaasExtension.class) @ExtendWith(JaasExtension.class)
class ProvideWorkbasketReportAccTest extends AbstractReportAccTest { class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
private static final Logger LOGGER = private static final MonitorService MONITOR_SERVICE = taskanaEngine.getMonitorService();
LoggerFactory.getLogger(ProvideWorkbasketReportAccTest.class);
@Test @Test
void testRoleCheck() { void testRoleCheck() {
MonitorService monitorService = taskanaEngine.getMonitorService(); assertThatThrownBy(() -> MONITOR_SERVICE.createWorkbasketReportBuilder().buildReport())
ThrowingCallable call = .isInstanceOf(NotAuthorizedException.class);
() -> {
monitorService.createWorkbasketReportBuilder().buildReport();
};
assertThatThrownBy(call).isInstanceOf(NotAuthorizedException.class);
} }
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetTotalNumbersOfTasksOfWorkbasketReportBasedOnDueDate() throws Exception { void testGetTotalNumbersOfTasksOfWorkbasketReportBasedOnDueDate() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService(); WorkbasketReport report = MONITOR_SERVICE.createWorkbasketReportBuilder().buildReport();
WorkbasketReport report = monitorService.createWorkbasketReportBuilder().buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -67,21 +61,15 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testGetWorkbasketReportWithReportLineItemDefinitions() throws Exception { void testGetWorkbasketReportWithReportLineItemDefinitions() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
final int sumLineCount = IntStream.of(report.getSumRow().getCells()).sum(); final int sumLineCount = IntStream.of(report.getSumRow().getCells()).sum();
assertThat(report).isNotNull(); assertThat(report).isNotNull();
@ -98,24 +86,31 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
assertThat(sumLineCount).isEqualTo(50); assertThat(sumLineCount).isEqualTo(50);
} }
@WithAccessId(user = "monitor")
@TestFactory
Stream<DynamicTest> should_NotThrowError_When_buildReportForTaskState() {
Iterator<TaskTimestamp> iterator = Arrays.stream(TaskTimestamp.values()).iterator();
ThrowingConsumer<TaskTimestamp> test =
timestamp -> {
ThrowingCallable callable =
() -> MONITOR_SERVICE.createWorkbasketReportBuilder().buildReport(timestamp);
assertThatCode(callable).doesNotThrowAnyException();
};
return DynamicTest.stream(iterator, t -> "for TaskState " + t, test);
}
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReport() throws Exception { void testEachItemOfWorkbasketReport() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -131,21 +126,39 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportNotInWorkingDays() throws Exception { void should_computeNumbersAccordingToPlannedDate_When_BuildReportForPlanned() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders)
.inWorkingDays()
.buildReport(TaskTimestamp.PLANNED);
assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3);
int[] row1 = report.getRow("USER-1-1").getCells();
assertThat(row1).isEqualTo(new int[] {0, 2, 18, 0, 0});
int[] row2 = report.getRow("USER-1-2").getCells();
assertThat(row2).isEqualTo(new int[] {0, 1, 19, 0, 0});
int[] row3 = report.getRow("USER-1-3").getCells();
assertThat(row3).isEqualTo(new int[] {0, 0, 10, 0, 0});
}
@WithAccessId(user = "monitor")
@Test
void testEachItemOfWorkbasketReportNotInWorkingDays() throws Exception {
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report =
MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -162,24 +175,18 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportWithWorkbasketFilter() throws Exception { void testEachItemOfWorkbasketReportWithWorkbasketFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> workbasketIds = List<String> workbasketIds =
Collections.singletonList("WBI:000000000000000000000000000000000001"); Collections.singletonList("WBI:000000000000000000000000000000000001");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(1); assertThat(report.rowSize()).isEqualTo(1);
@ -190,23 +197,17 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportWithStateFilter() throws Exception { void testEachItemOfWorkbasketReportWithStateFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TaskState> states = Collections.singletonList(TaskState.READY); List<TaskState> states = Collections.singletonList(TaskState.READY);
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.stateIn(states) .stateIn(states)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -223,23 +224,17 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportWithCategoryFilter() throws Exception { void testEachItemOfWorkbasketReportWithCategoryFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL"); List<String> categories = Arrays.asList("AUTOMATIC", "MANUAL");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.categoryIn(categories) .classificationCategoryIn(categories)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -256,23 +251,17 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportWithDomainFilter() throws Exception { void testEachItemOfWorkbasketReportWithDomainFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<String> domains = Collections.singletonList("DOMAIN_A"); List<String> domains = Collections.singletonList("DOMAIN_A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.domainIn(domains) .domainIn(domains)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -289,24 +278,18 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportWithCustomFieldValueFilter() throws Exception { void testEachItemOfWorkbasketReportWithCustomFieldValueFilter() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
Map<CustomField, String> customAttributeFilter = new HashMap<>(); Map<CustomField, String> customAttributeFilter = new HashMap<>();
customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A"); customAttributeFilter.put(CustomField.CUSTOM_1, "Geschaeftsstelle A");
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -323,8 +306,6 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@WithAccessId(user = "monitor") @WithAccessId(user = "monitor")
@Test @Test
void testEachItemOfWorkbasketReportForSelectedClassifications() throws Exception { void testEachItemOfWorkbasketReportForSelectedClassifications() throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getShortListOfColumnHeaders();
List<CombinedClassificationFilter> combinedClassificationFilter = new ArrayList<>(); List<CombinedClassificationFilter> combinedClassificationFilter = new ArrayList<>();
combinedClassificationFilter.add( combinedClassificationFilter.add(
@ -343,17 +324,13 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
new CombinedClassificationFilter("CLI:000000000000000000000000000000000005")); new CombinedClassificationFilter("CLI:000000000000000000000000000000000005"));
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.combinedClassificationFilterIn(combinedClassificationFilter) .combinedClassificationFilterIn(combinedClassificationFilter)
.inWorkingDays() .inWorkingDays()
.buildReport(); .buildReport();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report, columnHeaders));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -371,18 +348,13 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
@Test @Test
void testGetTotalNumbersOfTasksOfWorkbasketReportBasedOnPlannedDateWithReportLineItemDefinitions() void testGetTotalNumbersOfTasksOfWorkbasketReportBasedOnPlannedDateWithReportLineItemDefinitions()
throws Exception { throws Exception {
MonitorService monitorService = taskanaEngine.getMonitorService();
List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders(); List<TimeIntervalColumnHeader> columnHeaders = getListOfColumnHeaders();
WorkbasketReport report = WorkbasketReport report =
monitorService MONITOR_SERVICE
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.withColumnHeaders(columnHeaders) .withColumnHeaders(columnHeaders)
.buildPlannedDateBasedReport(); .buildReport(TaskTimestamp.PLANNED);
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(reportToString(report));
}
assertThat(report).isNotNull(); assertThat(report).isNotNull();
assertThat(report.rowSize()).isEqualTo(3); assertThat(report.rowSize()).isEqualTo(3);
@ -419,76 +391,4 @@ class ProvideWorkbasketReportAccTest extends AbstractReportAccTest {
columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE)); columnHeaders.add(new TimeIntervalColumnHeader(6, Integer.MAX_VALUE));
return columnHeaders; return columnHeaders;
} }
private String reportToString(WorkbasketReport report) {
return reportToString(report, null);
}
private String reportToString(
WorkbasketReport report, List<TimeIntervalColumnHeader> reportLineItemDefinitions) {
String formatColumWidth = "| %-7s ";
String formatFirstColumn = "| %-36s %-4s ";
final String formatFirstColumnFirstLine = "| %-29s %12s ";
final String formatFirstColumnSumLine = "| %-36s %-5s";
int reportWidth =
reportLineItemDefinitions == null ? 46 : reportLineItemDefinitions.size() * 10 + 46;
StringBuilder builder = new StringBuilder();
builder.append("\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
builder.append(String.format(formatFirstColumnFirstLine, "Workbaskets", "Total"));
if (reportLineItemDefinitions != null) {
for (TimeIntervalColumnHeader def : reportLineItemDefinitions) {
if (def.getLowerAgeLimit() == Integer.MIN_VALUE) {
builder.append(String.format(formatColumWidth, "< " + def.getUpperAgeLimit()));
} else if (def.getUpperAgeLimit() == Integer.MAX_VALUE) {
builder.append(String.format(formatColumWidth, "> " + def.getLowerAgeLimit()));
} else if (def.getLowerAgeLimit() == def.getUpperAgeLimit()) {
if (def.getLowerAgeLimit() == 0) {
builder.append(String.format(formatColumWidth, "today"));
} else {
builder.append(String.format(formatColumWidth, def.getLowerAgeLimit()));
}
} else {
builder.append(
String.format(
formatColumWidth, def.getLowerAgeLimit() + ".." + def.getUpperAgeLimit()));
}
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
for (String rl : report.rowTitles()) {
builder.append(String.format(formatFirstColumn, rl, report.getRow(rl).getTotalValue()));
if (reportLineItemDefinitions != null) {
for (int cell : report.getRow(rl).getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
}
builder.append(
String.format(formatFirstColumnSumLine, "Total", report.getSumRow().getTotalValue()));
for (int cell : report.getSumRow().getCells()) {
builder.append(String.format(formatColumWidth, cell));
}
builder.append("|\n");
for (int i = 0; i < reportWidth; i++) {
builder.append("-");
}
builder.append("\n");
return builder.toString();
}
} }

View File

@ -32,7 +32,7 @@ class ClassificationQueryImplTest {
@Mock private SqlSession sqlSession; @Mock private SqlSession sqlSession;
@Test @Test
void should_ReturnList_when_BuilderIsUsed() { void should_ReturnList_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>());
@ -47,7 +47,7 @@ class ClassificationQueryImplTest {
} }
@Test @Test
void should_ReturnListWithOffset_when_BuilderIsUsed() { void should_ReturnListWithOffset_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>());
@ -62,7 +62,7 @@ class ClassificationQueryImplTest {
} }
@Test @Test
void should_ReturnOneItem_when_BuilderIsUsed() { void should_ReturnOneItem_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectOne(any(), any())).thenReturn(new ClassificationSummaryImpl()); when(sqlSession.selectOne(any(), any())).thenReturn(new ClassificationSummaryImpl());

View File

@ -25,7 +25,8 @@ import pro.taskana.TaskanaEngineConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.reports.CategoryReport; import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationCategoryReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
import pro.taskana.task.api.CustomField; import pro.taskana.task.api.CustomField;
@ -33,7 +34,7 @@ import pro.taskana.task.api.TaskState;
/** Unit Test for CategoryBuilderImpl. */ /** Unit Test for CategoryBuilderImpl. */
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
class CategoryReportBuilderImplTest { class ClassificationClassificationCategoryReportBuilderImplTest {
@InjectMocks private MonitorServiceImpl cut; @InjectMocks private MonitorServiceImpl cut;
@ -72,16 +73,17 @@ class CategoryReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
.thenReturn(expectedResult); .thenReturn(expectedResult);
final CategoryReport actualResult = final ClassificationCategoryReport actualResult =
cut.createCategoryReportBuilder() cut.createCategoryReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -93,7 +95,7 @@ class CategoryReportBuilderImplTest {
verify(taskanaEngineMock).checkRoleMembership(any()); verify(taskanaEngineMock).checkRoleMembership(any());
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -102,8 +104,8 @@ class CategoryReportBuilderImplTest {
taskanaEngineConfiguration); taskanaEngineConfiguration);
assertThat(actualResult).isNotNull(); assertThat(actualResult).isNotNull();
assertThat(1).isEqualTo(actualResult.getRow("EXTERN").getTotalValue()); assertThat(actualResult.getRow("EXTERN").getTotalValue()).isOne();
assertThat(1).isEqualTo(actualResult.getSumRow().getTotalValue()); assertThat(actualResult.getSumRow().getTotalValue()).isOne();
} }
@Test @Test
@ -131,16 +133,17 @@ class CategoryReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
.thenReturn(expectedResult); .thenReturn(expectedResult);
final CategoryReport actualResult = final ClassificationCategoryReport actualResult =
cut.createCategoryReportBuilder() cut.createCategoryReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -153,7 +156,7 @@ class CategoryReportBuilderImplTest {
verify(taskanaEngineMock).checkRoleMembership(any()); verify(taskanaEngineMock).checkRoleMembership(any());
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfCategories(any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -162,9 +165,9 @@ class CategoryReportBuilderImplTest {
taskanaEngineConfiguration); taskanaEngineConfiguration);
assertThat(actualResult).isNotNull(); assertThat(actualResult).isNotNull();
assertThat(1).isEqualTo(actualResult.getRow("EXTERN").getTotalValue()); assertThat(actualResult.getRow("EXTERN").getTotalValue()).isOne();
assertThat(1).isEqualTo(actualResult.getRow("EXTERN").getCells()[0]); assertThat(actualResult.getRow("EXTERN").getCells()[0]).isOne();
assertThat(1).isEqualTo(actualResult.getSumRow().getTotalValue()); assertThat(actualResult.getSumRow().getTotalValue()).isOne();
} }
@Test @Test
@ -206,7 +209,7 @@ class CategoryReportBuilderImplTest {
cut.createCategoryReportBuilder() cut.createCategoryReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -228,7 +231,6 @@ class CategoryReportBuilderImplTest {
monitorMapperMock, monitorMapperMock,
taskanaEngineConfiguration); taskanaEngineConfiguration);
assertThat(actualResult).isNotNull();
assertThat(actualResult).isEqualTo(expectedResult); assertThat(actualResult).isEqualTo(expectedResult);
} }
@ -276,7 +278,7 @@ class CategoryReportBuilderImplTest {
cut.createCategoryReportBuilder() cut.createCategoryReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -297,7 +299,6 @@ class CategoryReportBuilderImplTest {
monitorMapperMock, monitorMapperMock,
taskanaEngineConfiguration); taskanaEngineConfiguration);
assertThat(actualResult).isNotNull();
assertThat(actualResult).isEqualTo(expectedResult); assertThat(actualResult).isEqualTo(expectedResult);
} }

View File

@ -25,6 +25,7 @@ import pro.taskana.TaskanaEngineConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.ClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport;
import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport; import pro.taskana.monitor.api.reports.ClassificationReport.DetailedClassificationReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
@ -75,6 +76,7 @@ class ClassificationReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -84,7 +86,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -97,7 +99,7 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -137,6 +139,7 @@ class ClassificationReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -146,7 +149,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -160,7 +163,7 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfClassifications(any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -199,6 +202,7 @@ class ClassificationReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -208,7 +212,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -221,7 +225,8 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfDetailedClassifications(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfDetailedClassifications(
any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -264,6 +269,7 @@ class ClassificationReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -273,7 +279,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -287,7 +293,8 @@ class ClassificationReportBuilderImplTest {
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfDetailedClassifications(any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfDetailedClassifications(
any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -347,7 +354,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -421,7 +428,7 @@ class ClassificationReportBuilderImplTest {
cut.createClassificationReportBuilder() cut.createClassificationReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)

View File

@ -24,6 +24,7 @@ import pro.taskana.TaskanaEngineConfiguration;
import pro.taskana.common.api.TaskanaEngine; import pro.taskana.common.api.TaskanaEngine;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.CustomFieldValueReport; import pro.taskana.monitor.api.reports.CustomFieldValueReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -72,6 +73,7 @@ class CustomFieldValueReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -81,7 +83,7 @@ class CustomFieldValueReportBuilderImplTest {
cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -93,7 +95,8 @@ class CustomFieldValueReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfCustomFieldValues(any(), any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfCustomFieldValues(
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -132,6 +135,7 @@ class CustomFieldValueReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter)) customAttributeFilter))
@ -141,7 +145,7 @@ class CustomFieldValueReportBuilderImplTest {
cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -154,7 +158,8 @@ class CustomFieldValueReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfCustomFieldValues(any(), any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfCustomFieldValues(
any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions( verifyNoMoreInteractions(
internalTaskanaEngineMock, internalTaskanaEngineMock,
@ -203,7 +208,7 @@ class CustomFieldValueReportBuilderImplTest {
cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1) cut.createCustomFieldValueReportBuilder(CustomField.CUSTOM_1)
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)

View File

@ -29,6 +29,7 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.internal.InternalTaskanaEngine; import pro.taskana.common.internal.InternalTaskanaEngine;
import pro.taskana.monitor.api.CombinedClassificationFilter; import pro.taskana.monitor.api.CombinedClassificationFilter;
import pro.taskana.monitor.api.SelectedItem; import pro.taskana.monitor.api.SelectedItem;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.WorkbasketReport; import pro.taskana.monitor.api.reports.WorkbasketReport;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.api.reports.item.MonitorQueryItem; import pro.taskana.monitor.api.reports.item.MonitorQueryItem;
@ -79,6 +80,7 @@ class WorkbasketReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter, customAttributeFilter,
@ -89,7 +91,7 @@ class WorkbasketReportBuilderImplTest {
cut.createWorkbasketReportBuilder() cut.createWorkbasketReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -102,7 +104,7 @@ class WorkbasketReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock); verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock);
@ -142,6 +144,7 @@ class WorkbasketReportBuilderImplTest {
states, states,
categories, categories,
domains, domains,
TaskTimestamp.DUE,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter, customAttributeFilter,
@ -152,7 +155,7 @@ class WorkbasketReportBuilderImplTest {
cut.createWorkbasketReportBuilder() cut.createWorkbasketReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -166,7 +169,7 @@ class WorkbasketReportBuilderImplTest {
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any()); .getTaskCountOfWorkbaskets(any(), any(), any(), any(), any(), any(), any(), any(), any());
verify(internalTaskanaEngineMock).returnConnection(); verify(internalTaskanaEngineMock).returnConnection();
verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock); verifyNoMoreInteractions(internalTaskanaEngineMock, taskanaEngineMock, monitorMapperMock);
@ -217,7 +220,7 @@ class WorkbasketReportBuilderImplTest {
cut.createWorkbasketReportBuilder() cut.createWorkbasketReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -288,7 +291,7 @@ class WorkbasketReportBuilderImplTest {
cut.createWorkbasketReportBuilder() cut.createWorkbasketReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
@ -340,11 +343,12 @@ class WorkbasketReportBuilderImplTest {
monitorQueryItem.setKey("WBI:000000000000000000000000000000000001"); monitorQueryItem.setKey("WBI:000000000000000000000000000000000001");
monitorQueryItem.setNumberOfTasks(1); monitorQueryItem.setNumberOfTasks(1);
expectedResult.add(monitorQueryItem); expectedResult.add(monitorQueryItem);
when(monitorMapperMock.getTaskCountOfWorkbasketsBasedOnPlannedDate( when(monitorMapperMock.getTaskCountOfWorkbaskets(
workbasketIds, workbasketIds,
states, states,
categories, categories,
domains, domains,
TaskTimestamp.PLANNED,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter, customAttributeFilter,
@ -355,24 +359,25 @@ class WorkbasketReportBuilderImplTest {
cut.createWorkbasketReportBuilder() cut.createWorkbasketReportBuilder()
.workbasketIdIn(workbasketIds) .workbasketIdIn(workbasketIds)
.stateIn(states) .stateIn(states)
.categoryIn(categories) .classificationCategoryIn(categories)
.domainIn(domains) .domainIn(domains)
.classificationIdIn(classificationIds) .classificationIdIn(classificationIds)
.excludedClassificationIdIn(excludedClassificationIds) .excludedClassificationIdIn(excludedClassificationIds)
.customAttributeFilterIn(customAttributeFilter) .customAttributeFilterIn(customAttributeFilter)
.combinedClassificationFilterIn(combinedClassificationFilter) .combinedClassificationFilterIn(combinedClassificationFilter)
.buildPlannedDateBasedReport(); .buildReport(TaskTimestamp.PLANNED);
verify(internalTaskanaEngineMock).openConnection(); verify(internalTaskanaEngineMock).openConnection();
verify(taskanaEngineMock).checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN); verify(taskanaEngineMock).checkRoleMembership(TaskanaRole.MONITOR, TaskanaRole.ADMIN);
verify(taskanaEngineMock).getWorkingDaysToDaysConverter(); verify(taskanaEngineMock).getWorkingDaysToDaysConverter();
verify(internalTaskanaEngineMock, times(2)).getEngine(); verify(internalTaskanaEngineMock, times(2)).getEngine();
verify(monitorMapperMock) verify(monitorMapperMock)
.getTaskCountOfWorkbasketsBasedOnPlannedDate( .getTaskCountOfWorkbaskets(
workbasketIds, workbasketIds,
states, states,
categories, categories,
domains, domains,
TaskTimestamp.PLANNED,
classificationIds, classificationIds,
excludedClassificationIds, excludedClassificationIds,
customAttributeFilter, customAttributeFilter,

View File

@ -36,7 +36,7 @@ class ObjectReferenceQueryImplTest {
} }
@Test @Test
void should_ReturnList_when_BuilderIsUsed() { void should_ReturnList_When_BuilderIsUsed() {
when(taskanaEngine.getSqlSession()).thenReturn(sqlSession); when(taskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>());
@ -51,7 +51,7 @@ class ObjectReferenceQueryImplTest {
} }
@Test @Test
void should_ReturnListWithOffset_when_BuilderIsUsed() { void should_ReturnListWithOffset_When_BuilderIsUsed() {
when(taskanaEngine.getSqlSession()).thenReturn(sqlSession); when(taskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>());
@ -66,7 +66,7 @@ class ObjectReferenceQueryImplTest {
} }
@Test @Test
void should_ReturnOneItem_when_BuilderIsUsed() { void should_ReturnOneItem_When_BuilderIsUsed() {
when(taskanaEngine.getSqlSession()).thenReturn(sqlSession); when(taskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectOne(any(), any())).thenReturn(new ObjectReference()); when(sqlSession.selectOne(any(), any())).thenReturn(new ObjectReference());

View File

@ -50,7 +50,7 @@ class TaskQueryImplTest {
} }
@Test @Test
void should_ReturnList_when_BuilderIsUsed() { void should_ReturnList_When_BuilderIsUsed() {
when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>());
List<TaskSummary> intermediate = new ArrayList<>(); List<TaskSummary> intermediate = new ArrayList<>();
intermediate.add(new TaskSummaryImpl()); intermediate.add(new TaskSummaryImpl());
@ -66,7 +66,7 @@ class TaskQueryImplTest {
} }
@Test @Test
void should_ReturnListWithOffset_when_BuilderIsUsed() { void should_ReturnListWithOffset_When_BuilderIsUsed() {
when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>());
List<TaskSummary> intermediate = new ArrayList<>(); List<TaskSummary> intermediate = new ArrayList<>();
intermediate.add(new TaskSummaryImpl()); intermediate.add(new TaskSummaryImpl());
@ -82,7 +82,7 @@ class TaskQueryImplTest {
} }
@Test @Test
void should_ReturnOneItem_when_BuilderIsUsed() { void should_ReturnOneItem_When_BuilderIsUsed() {
when(sqlSession.selectOne(any(), any())).thenReturn(new TaskSummaryImpl()); when(sqlSession.selectOne(any(), any())).thenReturn(new TaskSummaryImpl());
List<TaskSummary> intermediate = new ArrayList<>(); List<TaskSummary> intermediate = new ArrayList<>();
intermediate.add(new TaskSummaryImpl()); intermediate.add(new TaskSummaryImpl());

View File

@ -140,7 +140,7 @@ class TaskServiceImplIntAutocommitTest {
} }
@Test @Test
void should_ReturnList_when_BuilderIsUsed() throws Exception { void should_ReturnList_When_BuilderIsUsed() throws Exception {
Workbasket wb = workbasketService.newWorkbasket("key", "DOMAIN_A"); Workbasket wb = workbasketService.newWorkbasket("key", "DOMAIN_A");
wb.setName("workbasket"); wb.setName("workbasket");
wb.setType(WorkbasketType.GROUP); wb.setType(WorkbasketType.GROUP);

View File

@ -218,7 +218,7 @@ class TaskServiceImplIntExplicitTest {
@WithAccessId(user = "user-1-1", groups = "businessadmin") @WithAccessId(user = "user-1-1", groups = "businessadmin")
@Test @Test
void should_ReturnList_when_BuilderIsUsed() throws Exception { void should_ReturnList_When_BuilderIsUsed() throws Exception {
try (Connection connection = dataSource.getConnection()) { try (Connection connection = dataSource.getConnection()) {
taskanaEngineImpl.setConnection(connection); taskanaEngineImpl.setConnection(connection);
WorkbasketImpl workbasket = WorkbasketImpl workbasket =

View File

@ -32,7 +32,7 @@ class WorkbasketAccessItemQueryImplTest {
@Mock private SqlSession sqlSession; @Mock private SqlSession sqlSession;
@Test @Test
void should_ReturnList_when_BuilderIsUsed() { void should_ReturnList_When_BuilderIsUsed() {
when(internalTaskanaEngine.openAndReturnConnection(any())).thenReturn(new ArrayList<>()); when(internalTaskanaEngine.openAndReturnConnection(any())).thenReturn(new ArrayList<>());
List<WorkbasketAccessItem> result = List<WorkbasketAccessItem> result =
@ -41,7 +41,7 @@ class WorkbasketAccessItemQueryImplTest {
} }
@Test @Test
void should_ReturnListWithOffset_when_BuilderIsUsed() { void should_ReturnListWithOffset_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>());
@ -51,7 +51,7 @@ class WorkbasketAccessItemQueryImplTest {
} }
@Test @Test
void should_ReturnOneItem_when_BuilderIsUsed() { void should_ReturnOneItem_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectOne(any(), any())).thenReturn(new WorkbasketAccessItemImpl()); when(sqlSession.selectOne(any(), any())).thenReturn(new WorkbasketAccessItemImpl());

View File

@ -41,7 +41,7 @@ class WorkbasketQueryImplTest {
} }
@Test @Test
void should_ReturnList_when_BuilderIsUsed() { void should_ReturnList_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any())).thenReturn(new ArrayList<>());
@ -54,7 +54,7 @@ class WorkbasketQueryImplTest {
} }
@Test @Test
void should_ReturnListWithOffset_when_BuilderIsUsed() { void should_ReturnListWithOffset_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>()); when(sqlSession.selectList(any(), any(), any())).thenReturn(new ArrayList<>());
@ -67,7 +67,7 @@ class WorkbasketQueryImplTest {
} }
@Test @Test
void should_ReturnOneItem_when_BuilderIsUsed() { void should_ReturnOneItem_When_BuilderIsUsed() {
when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession); when(internalTaskanaEngine.getSqlSession()).thenReturn(sqlSession);
when(sqlSession.selectOne(any(), any())).thenReturn(new WorkbasketSummaryImpl()); when(sqlSession.selectOne(any(), any())).thenReturn(new WorkbasketSummaryImpl());

View File

@ -20,6 +20,7 @@ import pro.taskana.common.api.exceptions.InvalidArgumentException;
import pro.taskana.common.api.exceptions.NotAuthorizedException; import pro.taskana.common.api.exceptions.NotAuthorizedException;
import pro.taskana.common.rest.Mapping; import pro.taskana.common.rest.Mapping;
import pro.taskana.monitor.api.MonitorService; import pro.taskana.monitor.api.MonitorService;
import pro.taskana.monitor.api.TaskTimestamp;
import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader; import pro.taskana.monitor.api.reports.header.TimeIntervalColumnHeader;
import pro.taskana.monitor.rest.assembler.ReportRepresentationModelAssembler; import pro.taskana.monitor.rest.assembler.ReportRepresentationModelAssembler;
import pro.taskana.monitor.rest.models.ReportRepresentationModel; import pro.taskana.monitor.rest.models.ReportRepresentationModel;
@ -109,7 +110,7 @@ public class MonitorController {
.createWorkbasketReportBuilder() .createWorkbasketReportBuilder()
.stateIn(states) .stateIn(states)
.withColumnHeaders(getDateTimeInterval(daysInPast)) .withColumnHeaders(getDateTimeInterval(daysInPast))
.buildPlannedDateBasedReport(), .buildReport(TaskTimestamp.PLANNED),
daysInPast, daysInPast,
states); states);
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {

View File

@ -95,8 +95,7 @@ class TaskCommentControllerRestDocumentation extends BaseRestDocumentation {
.perform( .perform(
RestDocumentationRequestBuilders.get( RestDocumentationRequestBuilders.get(
restHelper.toUrl( restHelper.toUrl(
Mapping.URL_TASK_COMMENTS, Mapping.URL_TASK_COMMENTS, "TKI:000000000000000000000000000000000000"))
"TKI:000000000000000000000000000000000000"))
.accept(MediaTypes.HAL_JSON) .accept(MediaTypes.HAL_JSON)
.header("Authorization", ADMIN_CREDENTIALS)) .header("Authorization", ADMIN_CREDENTIALS))
.andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.status().isOk())
@ -172,8 +171,7 @@ class TaskCommentControllerRestDocumentation extends BaseRestDocumentation {
.perform( .perform(
RestDocumentationRequestBuilders.post( RestDocumentationRequestBuilders.post(
restHelper.toUrl( restHelper.toUrl(
Mapping.URL_TASK_COMMENTS, Mapping.URL_TASK_COMMENTS, "TKI:000000000000000000000000000000000000"))
"TKI:000000000000000000000000000000000000"))
.contentType(MediaTypes.HAL_JSON) .contentType(MediaTypes.HAL_JSON)
.content(createTaskCommentContent) .content(createTaskCommentContent)
.header("Authorization", ADMIN_CREDENTIALS)) .header("Authorization", ADMIN_CREDENTIALS))