package com.constellio.app.modules.rm.model.calculators.document;
import static com.constellio.app.modules.rm.model.enums.RetentionRuleScope.DOCUMENTS;
import static com.constellio.app.modules.rm.wrappers.Document.FOLDER_ACTUAL_DEPOSIT_DATE;
import static com.constellio.app.modules.rm.wrappers.Document.FOLDER_ACTUAL_DESTRUCTION_DATE;
import static com.constellio.app.modules.rm.wrappers.Document.FOLDER_ACTUAL_TRANSFER_DATE;
import static com.constellio.app.modules.rm.wrappers.RetentionRule.SCOPE;
import static java.util.Arrays.asList;
import java.util.List;
import org.joda.time.LocalDate;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.model.enums.FolderStatus;
import com.constellio.app.modules.rm.model.enums.RetentionRuleScope;
import com.constellio.app.modules.rm.wrappers.Document;
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.calculators.dependencies.ReferenceDependency;
import com.constellio.model.entities.schemas.MetadataValueType;
public class DocumentArchivisticStatusCalculator implements MetadataValueCalculator<FolderStatus> {
ConfigDependency<Boolean> documentRetentionRulesEnabledParam = RMConfigs.DOCUMENT_RETENTION_RULES.dependency();
LocalDependency<LocalDate> folderActualTransferDateParam = LocalDependency.toADate(FOLDER_ACTUAL_TRANSFER_DATE);
LocalDependency<LocalDate> folderActualDepositDateParam = LocalDependency.toADate(FOLDER_ACTUAL_DEPOSIT_DATE);
LocalDependency<LocalDate> folderActualDestructionDateParam = LocalDependency.toADate(FOLDER_ACTUAL_DESTRUCTION_DATE);
ReferenceDependency<FolderStatus> folderStatusParam = ReferenceDependency
.toAnEnum(Document.FOLDER, Folder.ARCHIVISTIC_STATUS);
LocalDependency<String> documentTypeParam = LocalDependency.toAReference(Document.TYPE);
ReferenceDependency<RetentionRuleScope> retentionRuleScopeParam = ReferenceDependency
.toAnEnum(Document.FOLDER_RETENTION_RULE, SCOPE);
@Override
public FolderStatus calculate(CalculatorParameters parameters) {
CalculatorInput input = new CalculatorInput(parameters);
//if (!input.documentRetentionRulesEnabled) {
if (!input.documentRetentionRulesEnabled || (input.retentionRuleScope != DOCUMENTS && input.documentType == null)) {
return input.folderStatus;
} else {
if (input.folderActualDepositDate != null) {
return FolderStatus.INACTIVE_DEPOSITED;
} else if (input.folderActualDestructionDate != null) {
return FolderStatus.INACTIVE_DESTROYED;
} else if (input.folderActualTransferDate != null) {
return FolderStatus.SEMI_ACTIVE;
} else {
return FolderStatus.ACTIVE;
}
}
}
@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 asList(folderStatusParam, folderActualTransferDateParam, folderActualDepositDateParam,
folderActualDestructionDateParam, documentRetentionRulesEnabledParam, documentTypeParam, retentionRuleScopeParam);
}
class CalculatorInput {
boolean documentRetentionRulesEnabled;
LocalDate folderActualTransferDate, folderActualDepositDate, folderActualDestructionDate;
FolderStatus folderStatus;
RetentionRuleScope retentionRuleScope;
String documentType;
CalculatorInput(CalculatorParameters parameters) {
this.documentRetentionRulesEnabled = parameters.get(documentRetentionRulesEnabledParam);
this.folderActualTransferDate = parameters.get(folderActualTransferDateParam);
this.folderActualDepositDate = parameters.get(folderActualDepositDateParam);
this.folderActualDestructionDate = parameters.get(folderActualDestructionDateParam);
this.folderStatus = parameters.get(folderStatusParam);
this.retentionRuleScope = parameters.get(retentionRuleScopeParam);
this.documentType = parameters.get(documentTypeParam);
}
}
}