package com.constellio.app.modules.rm.model.calculators;
import static com.constellio.app.modules.rm.model.calculators.CalculatorUtils.calculateExpectedTransferDate;
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.CopyRetentionRule;
import com.constellio.app.modules.rm.model.calculators.folder.FolderDecomDatesDynamicLocalDependency;
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.DynamicDependencyValues;
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;
public class FolderCopyRulesExpectedTransferDatesCalculator
extends AbstractFolderCopyRulesExpectedDatesCalculator
implements MetadataValueCalculator<List<LocalDate>> {
LocalDependency<LocalDate> decommissioningDateParam = LocalDependency.toADate(Folder.DECOMMISSIONING_DATE);
LocalDependency<LocalDate> actualTransferDateParam = LocalDependency.toADate(Folder.ACTUAL_TRANSFER_DATE);
LocalDependency<FolderStatus> statusParam = LocalDependency.toAnEnum(Folder.ARCHIVISTIC_STATUS);
FolderDecomDatesDynamicLocalDependency datesAndDateTimesParam = new FolderDecomDatesDynamicLocalDependency();
ConfigDependency<Integer> configNumberOfYearWhenVariableDelayPeriodParam =
RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD.dependency();
ConfigDependency<Boolean> calculatedMetadatasBasedOnFirstTimerangePartParam = RMConfigs.CALCULATED_METADATAS_BASED_ON_FIRST_TIMERANGE_PART
.dependency();
@Override
protected List<? extends Dependency> getCopyRuleDateCalculationDependencies() {
return Arrays.asList(decommissioningDateParam, actualTransferDateParam, datesAndDateTimesParam,
configNumberOfYearWhenVariableDelayPeriodParam, statusParam, calculatedMetadatasBasedOnFirstTimerangePartParam);
}
@Override
protected LocalDate calculateForCopyRule(int index, CopyRetentionRule copyRule, CalculatorParameters parameters) {
CalculatorInput input = new CalculatorInput(parameters);
if (input.actualTransferDate != null || FolderStatus.ACTIVE != parameters.get(statusParam)) {
return null;
} else {
LocalDate date = getAdjustedDateUsedToCalculation(input, copyRule, parameters.get(configYearEndParam));
return calculateExpectedTransferDate(copyRule, date, input.numberOfYearWhenVariableDelayPeriod);
}
}
private LocalDate getAdjustedDateUsedToCalculation(CalculatorInput input, CopyRetentionRule copyRule, String yearEnd) {
LocalDate activeDelayDate = input.getAdjustedBaseDateFromActiveDelay(copyRule, yearEnd);
if (activeDelayDate != null) {
return activeDelayDate;
} else {
return input.decommissioningDate;
}
}
private class CalculatorInput extends AbstractFolderCopyRulesExpectedDatesCalculator_CalculatorInput {
LocalDate decommissioningDate;
LocalDate actualTransferDate;
DynamicDependencyValues datesAndDateTimes;
Integer numberOfYearWhenVariableDelayPeriod;
boolean calculatedMetadatasBasedOnFirstTimerangePart;
public CalculatorInput(CalculatorParameters parameters) {
super(parameters);
this.decommissioningDate = parameters.get(decommissioningDateParam);
this.actualTransferDate = parameters.get(actualTransferDateParam);
this.datesAndDateTimes = parameters.get(datesAndDateTimesParam);
this.numberOfYearWhenVariableDelayPeriod = parameters.get(configNumberOfYearWhenVariableDelayPeriodParam);
this.calculatedMetadatasBasedOnFirstTimerangePart = parameters.get(calculatedMetadatasBasedOnFirstTimerangePartParam);
}
public LocalDate getAdjustedBaseDateFromActiveDelay(CopyRetentionRule copy, String yearEnd) {
String metadata = copy.getActiveDateMetadata();
LocalDate date = datesAndDateTimesParam
.getDate(metadata, datesAndDateTimes, yearEnd, calculatedMetadatasBasedOnFirstTimerangePart);
return date == null ? null : adjustToFinancialYear(date);
}
}
}