package com.constellio.app.modules.rm.model.validators;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.modules.rm.wrappers.UniformSubdivision;
import com.constellio.model.entities.schemas.validation.RecordValidator;
import com.constellio.model.services.records.RecordValidatorParams;
import java.util.HashMap;
import java.util.Map;
public class FolderValidator implements RecordValidator {
public static final String FOLDER_CATEGORY_MUST_BE_RELATED_TO_ITS_RULE = "folderCategoryMustBeRelatedToItsRule";
public static final String FOLDER_UNIFORM_SUBDIVISION_MUST_BE_RELATED_TO_ITS_RULE = "folderUniformSubdivisionMustBeRelatedToItsRule";
public static final String FOLDER_OPENING_DATE_GREATER_THAN_CLOSING_DATE = "folderOpeningDataGreaterThanClosingDate";
public static final String RULE_CODE = "ruleCode";
public static final String CATEGORY_CODE = "categoryCode";
public static final String UNIFORM_SUBDIVISION = "categoryCode";
public static final String OPENING_DATE = "openingDate";
public static final String CLOSING_DATE = "closingDate";
@Override
public void validate(RecordValidatorParams params) {
Folder folder = new Folder(params.getValidatedRecord(), params.getTypes());
validate(folder, params);
}
private void validate(Folder folder, RecordValidatorParams params) {
RetentionRule retentionRule = RetentionRule.wrap(params.getRecord(folder.getRetentionRule()), params.getTypes());
String uniformSubdivisionId = folder.getUniformSubdivision();
Boolean areUniformSubdivisionEnabled = (Boolean) params.getConfigProvider().get(RMConfigs.UNIFORM_SUBDIVISION_ENABLED);
if(areUniformSubdivisionEnabled && uniformSubdivisionId != null) {
UniformSubdivision uniformSubdivision = new UniformSubdivision(params.getRecord(uniformSubdivisionId), params.getTypes());
if(uniformSubdivision.getRetentionRules() == null || !uniformSubdivision.getRetentionRules().contains(retentionRule.getId())) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(RULE_CODE, retentionRule.getCode());
parameters.put(UNIFORM_SUBDIVISION, uniformSubdivision.getCode());
params.getValidationErrors().add(FolderValidator.class, FOLDER_UNIFORM_SUBDIVISION_MUST_BE_RELATED_TO_ITS_RULE, parameters);
}
} else if (params.getConfigProvider().get(RMConfigs.ENFORCE_CATEGORY_AND_RULE_RELATIONSHIP_IN_FOLDER)) {
Category category = Category.wrap(params.getRecord(folder.getCategory()), params.getTypes());
if (!category.getRententionRules().contains(retentionRule.getId())) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(RULE_CODE, retentionRule.getCode());
parameters.put(CATEGORY_CODE, category.getCode());
params.getValidationErrors().add(FolderValidator.class, FOLDER_CATEGORY_MUST_BE_RELATED_TO_ITS_RULE, parameters);
}
}
if (folder != null && folder.getCloseDateEntered() != null && folder.getOpeningDate().compareTo(folder.getCloseDateEntered()) > 0) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(OPENING_DATE, folder.getOpeningDate());
parameters.put(CLOSING_DATE, folder.getCloseDate());
params.getValidationErrors().add(FolderValidator.class, FOLDER_OPENING_DATE_GREATER_THAN_CLOSING_DATE, parameters);
}
}
}