package com.constellio.app.modules.tasks.model.calculators; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.model.wrappers.structures.TaskReminder; import com.constellio.model.entities.schemas.MetadataValueType; import org.joda.time.LocalDate; import java.util.List; import static java.util.Arrays.asList; public class TaskNextReminderOnCalculator implements MetadataValueCalculator<LocalDate> { LocalDependency<List<TaskReminder>> remindersLocalDependency = LocalDependency.toAStructure(Task.REMINDERS) .whichIsMultivalue().whichIsRequired(); LocalDependency<LocalDate> startDateLocalDependency = LocalDependency.toADate(Task.START_DATE); LocalDependency<LocalDate> endDateLocalDependency = LocalDependency.toADate(Task.DUE_DATE); @Override public LocalDate calculate(CalculatorParameters parameters) { LocalDate oldestReminderDate = null; List<TaskReminder> taskReminderList = parameters.get(remindersLocalDependency); LocalDate startDate = parameters.get(startDateLocalDependency); LocalDate endDate = parameters.get(endDateLocalDependency); if (taskReminderList != null) { for (TaskReminder currentTaskReminder : taskReminderList) { LocalDate currentReminderDate = computeReminders(currentTaskReminder, startDate, endDate); if (oldestReminderDate == null) { oldestReminderDate = currentReminderDate; } else if (currentReminderDate != null && currentReminderDate.isBefore(oldestReminderDate)) { oldestReminderDate = currentReminderDate; } } } return oldestReminderDate; } private LocalDate computeReminders(TaskReminder taskReminder, LocalDate startDate, LocalDate endDate) { if (taskReminder.isProcessed()) { return null; } return taskReminder.computeDate(startDate, endDate); } @Override public LocalDate getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return MetadataValueType.DATE; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return asList(remindersLocalDependency, startDateLocalDependency, endDateLocalDependency); } }