package com.constellio.app.modules.rm.model.calculators; import static com.constellio.app.modules.rm.model.calculators.CalculatorUtils.toNextEndOfYearDateIfNotAlready; import java.util.Arrays; import java.util.List; import org.joda.time.LocalDate; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.model.enums.DecommissioningDateBasedOn; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.ConfigDependency; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.model.entities.schemas.MetadataValueType; public class FolderDecommissioningDateCalculator2 implements MetadataValueCalculator<LocalDate> { LocalDependency<LocalDate> openingDateParam = LocalDependency.toADate(Folder.OPENING_DATE); LocalDependency<LocalDate> closingDateParam = LocalDependency.toADate(Folder.CLOSING_DATE); LocalDependency<LocalDate> actualTransferDateParam = LocalDependency.toADate(Folder.ACTUAL_TRANSFER_DATE); LocalDependency<List<LocalDate>> reactivationDatesParam = LocalDependency.toADate(Folder.REACTIVATION_DATES) .whichIsMultivalue(); LocalDependency<LocalDate> reactivationDecommissioningDateParam = LocalDependency .toADate(Folder.REACTIVATION_DECOMMISSIONING_DATE); LocalDependency<FolderStatus> folderStatusParam = LocalDependency.toAnEnum(Folder.ARCHIVISTIC_STATUS); ConfigDependency<DecommissioningDateBasedOn> decommissioningDateBasedOnParam = RMConfigs.DECOMMISSIONING_DATE_BASED_ON.dependency(); ConfigDependency<Integer> configRequiredDaysBeforeYearEndParam = RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR.dependency(); ConfigDependency<String> configYearEndParam = RMConfigs.YEAR_END_DATE.dependency(); @Override public LocalDate calculate(CalculatorParameters parameters) { LocalDate openingDate = parameters.get(openingDateParam); LocalDate closingDate = parameters.get(closingDateParam); List<LocalDate> reactivationDates = parameters.get(reactivationDatesParam); LocalDate reactivationDecommissioningDate = parameters.get(reactivationDecommissioningDateParam); LocalDate actualTransferDate = parameters.get(actualTransferDateParam); FolderStatus folderStatus = parameters.get(folderStatusParam); DecommissioningDateBasedOn basedOn = parameters.get(decommissioningDateBasedOnParam); String yearEnd = parameters.get(configYearEndParam); int requiredDaysBeforeYearEnd = parameters.get(configRequiredDaysBeforeYearEndParam); if (actualTransferDate != null && folderStatus.isActiveOrSemiActive()) { return toNextEndOfYearDateIfNotAlready(actualTransferDate, yearEnd, requiredDaysBeforeYearEnd); } else if (reactivationDates != null && !reactivationDates.isEmpty()) { if (reactivationDecommissioningDate == null) { return toNextEndOfYearDateIfNotAlready(reactivationDates.get(0), yearEnd, requiredDaysBeforeYearEnd); } else { return toNextEndOfYearDateIfNotAlready(reactivationDecommissioningDate, yearEnd, requiredDaysBeforeYearEnd); } } else if (DecommissioningDateBasedOn.OPEN_DATE == basedOn) { return toNextEndOfYearDateIfNotAlready(openingDate, yearEnd, requiredDaysBeforeYearEnd); } else { return toNextEndOfYearDateIfNotAlready(closingDate, yearEnd, requiredDaysBeforeYearEnd); } } @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 Arrays .asList(openingDateParam, closingDateParam, actualTransferDateParam, folderStatusParam, decommissioningDateBasedOnParam, configRequiredDaysBeforeYearEndParam, configYearEndParam, reactivationDecommissioningDateParam, reactivationDatesParam); } }