package com.constellio.app.modules.rm.model.calculators;
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.AllowModificationOfArchivisticStatusAndExpectedDatesChoice;
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 FolderArchivisticStatusCalculator2 implements MetadataValueCalculator<FolderStatus> {
LocalDependency<LocalDate> transferDateParam = LocalDependency.toADate(Folder.ACTUAL_TRANSFER_DATE);
LocalDependency<LocalDate> depositDateParam = LocalDependency.toADate(Folder.ACTUAL_DEPOSIT_DATE);
LocalDependency<LocalDate> destructionDateParam = LocalDependency.toADate(Folder.ACTUAL_DESTRUCTION_DATE);
LocalDependency<FolderStatus> manualArchivisticStatus = LocalDependency.toAnEnum(Folder.MANUAL_ARCHIVISTIC_STATUS);
ConfigDependency<AllowModificationOfArchivisticStatusAndExpectedDatesChoice> manualMetadataChoiceConfigDependency
= RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES.dependency();
@Override
public FolderStatus calculate(CalculatorParameters parameters) {
AllowModificationOfArchivisticStatusAndExpectedDatesChoice manualMetadataChoice = parameters.get(manualMetadataChoiceConfigDependency);
if (manualMetadataChoice == null || manualMetadataChoice == AllowModificationOfArchivisticStatusAndExpectedDatesChoice.DISABLED) {
return calculateWithoutConsideringManualMetadata(parameters);
} else {
FolderStatus manualStatus = parameters.get(manualArchivisticStatus);
if (manualStatus == null) {
return calculateWithoutConsideringManualMetadata(parameters);
} else {
return manualStatus;
}
}
}
private FolderStatus calculateWithoutConsideringManualMetadata(CalculatorParameters parameters) {
LocalDate transferDate = parameters.get(transferDateParam);
LocalDate depositDate = parameters.get(depositDateParam);
LocalDate destructionDate = parameters.get(destructionDateParam);
FolderStatus status;
if (depositDate != null) {
status = FolderStatus.INACTIVE_DEPOSITED;
} else if (destructionDate != null) {
status = FolderStatus.INACTIVE_DESTROYED;
} else if (transferDate != null) {
status = FolderStatus.SEMI_ACTIVE;
} else {
status = FolderStatus.ACTIVE;
}
return status;
}
@Override
public FolderStatus getDefaultValue() {
return null;
}
@Override
public MetadataValueType getReturnType() {
return MetadataValueType.ENUM;
}
@Override
public boolean isMultiValue() {
return false;
}
@Override
public List<? extends Dependency> getDependencies() {
return Arrays.asList(transferDateParam, depositDateParam, destructionDateParam, manualArchivisticStatus,
manualMetadataChoiceConfigDependency);
}
}