package com.constellio.app.modules.rm.model.calculators; import java.util.ArrayList; import java.util.List; import org.joda.time.LocalDate; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.model.CopyRetentionRule; 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 abstract class AbstractFolderCopyRulesExpectedDatesCalculator implements MetadataValueCalculator<List<LocalDate>> { LocalDependency<List<CopyRetentionRule>> applicableCopyRulesParam = LocalDependency .toAStructure(Folder.APPLICABLE_COPY_RULES).whichIsMultivalue(); ConfigDependency<Integer> configRequiredDaysBeforeYearEndParam = RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR.dependency(); ConfigDependency<String> configYearEndParam = RMConfigs.YEAR_END_DATE.dependency(); ConfigDependency<Boolean> configAddYearIfCalculationDateIsEndOfYearParam = RMConfigs.ADD_YEAR_IF_CALULATION_DATE_IS_END_IF_YEAR.dependency(); @Override public List<LocalDate> calculate(CalculatorParameters parameters) { List<CopyRetentionRule> applicableCopyRules = parameters.get(applicableCopyRulesParam); String yearEnd = parameters.get(configYearEndParam); int requiredDaysBeforeYearEnd = parameters.get(configRequiredDaysBeforeYearEndParam); boolean addYearIfCalculationDateIsEndOfYearParam = parameters.get(configAddYearIfCalculationDateIsEndOfYearParam); List<LocalDate> result = new ArrayList<>(); for (int i = 0; i < applicableCopyRules.size(); i++) { CopyRetentionRule applicableCopyRule = applicableCopyRules.get(i); LocalDate copyRuleCalculedDate = calculateForCopyRule(i, applicableCopyRule, parameters); if (copyRuleCalculedDate == null) { result.add(null); } else if (CalculatorUtils.isEndOfYear(copyRuleCalculedDate, yearEnd)) { result.add(copyRuleCalculedDate); } else { result.add(CalculatorUtils.toNextEndOfYearDate(copyRuleCalculedDate, yearEnd, requiredDaysBeforeYearEnd, addYearIfCalculationDateIsEndOfYearParam)); } } return result; } @Override public List<LocalDate> getDefaultValue() { return new ArrayList<>(); } @Override public MetadataValueType getReturnType() { return MetadataValueType.DATE; } @Override public boolean isMultiValue() { return true; } @Override public List<? extends Dependency> getDependencies() { List<Dependency> dependencies = new ArrayList<>(); dependencies.add(applicableCopyRulesParam); dependencies.add(configRequiredDaysBeforeYearEndParam); dependencies.add(configYearEndParam); dependencies.add(configAddYearIfCalculationDateIsEndOfYearParam); dependencies.addAll(getCopyRuleDateCalculationDependencies()); return dependencies; } protected abstract List<? extends Dependency> getCopyRuleDateCalculationDependencies(); protected abstract LocalDate calculateForCopyRule(int index, CopyRetentionRule copyRule, CalculatorParameters parameters); protected class AbstractFolderCopyRulesExpectedDatesCalculator_CalculatorInput { protected List<CopyRetentionRule> applicableCopyRules; protected Integer requiredDaysBeforeYearEnd; protected String yearEnd; public AbstractFolderCopyRulesExpectedDatesCalculator_CalculatorInput(CalculatorParameters parameters) { applicableCopyRules = parameters.get(applicableCopyRulesParam); requiredDaysBeforeYearEnd = parameters.get(configRequiredDaysBeforeYearEndParam); yearEnd = parameters.get(configYearEndParam); } LocalDate adjustToFinancialYear(LocalDate date) { return CalculatorUtils.toNextEndOfYearDateIfNotAlready(date, yearEnd, requiredDaysBeforeYearEnd); } } }