package com.constellio.app.modules.rm.ui.pages.retentionRule;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.enums.RetentionRuleScope;
import com.constellio.app.modules.rm.navigation.RMViews;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService;
import com.constellio.app.modules.rm.ui.builders.RetentionRuleToVOBuilder;
import com.constellio.app.modules.rm.ui.components.retentionRule.RetentionRuleDisplayFactory.RetentionRuleDisplayPresenter;
import com.constellio.app.modules.rm.ui.entities.RetentionRuleVO;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.app.modules.rm.wrappers.UniformSubdivision;
import com.constellio.app.modules.rm.wrappers.type.VariableRetentionPeriod;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.entities.VariableRetentionPeriodVO;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
public class DisplayRetentionRulePresenter extends SingleSchemaBasePresenter<DisplayRetentionRuleView>
implements RetentionRuleDisplayPresenter {
private RetentionRuleVO retentionRuleVO;
private transient DecommissioningService decommissioningService;
public DisplayRetentionRulePresenter(DisplayRetentionRuleView view) {
super(view, RetentionRule.DEFAULT_SCHEMA);
decommissioningService = new DecommissioningService(collection, appLayerFactory);
}
public void forParams(String params) {
Record record = getRecord(params);
retentionRuleVO = new RetentionRuleToVOBuilder(
appLayerFactory, types().getDefaultSchema(Category.SCHEMA_TYPE), schema(UniformSubdivision.DEFAULT_SCHEMA))
.build(record, VIEW_MODE.DISPLAY, view.getSessionContext());
view.setRetentionRule(retentionRuleVO);
}
public void backButtonClicked() {
view.navigate().to(RMViews.class).listRetentionRules();
}
public void editButtonClicked() {
view.navigate().to(RMViews.class).editRetentionRule(retentionRuleVO.getId());
}
public void deleteButtonClicked() {
Record record = getRecord(retentionRuleVO.getId());
delete(record, false);
view.navigate().to(RMViews.class).listRetentionRules();
}
public String getFoldersNumber() {
return String.valueOf(decommissioningService.getFolderCountForRetentionRule(retentionRuleVO.getId()));
}
@Override
public boolean isDeletable(RecordVO entity) {
RecordServices recordService = modelLayerFactory.newRecordServices();
Record record = getRecord(entity.getId());
User user = getCurrentUser();
return recordService.isLogicallyDeletable(record, user);
}
@Override
public List<VariableRetentionPeriodVO> getOpenActivePeriodsDDVList() {
List<String> variablePeriodCodes = new ArrayList<>();
for (CopyRetentionRule copyRetentionRule : retentionRuleVO.getCopyRetentionRules()) {
if (!variablePeriodCodes.contains("" + copyRetentionRule.getActiveRetentionPeriod().getValue())) {
variablePeriodCodes.add("" + copyRetentionRule.getActiveRetentionPeriod().getValue());
}
}
List<VariableRetentionPeriodVO> returnList = new ArrayList<>();
LogicalSearchCondition condition = from(schemaType(VariableRetentionPeriod.SCHEMA_TYPE).getDefaultSchema())
.where(Schemas.CODE).isIn(variablePeriodCodes);
List<Record> records = searchServices().search(new LogicalSearchQuery(condition));
for (Record record : records) {
VariableRetentionPeriodVO variableRetentionPeriodVO = new VariableRetentionPeriodVO().setRecordId(record.getId())
.setTitle((String) record.get(
Schemas.TITLE)).setCode((String) record.get(Schemas.CODE));
returnList.add(variableRetentionPeriodVO);
}
return returnList;
}
@Override
public boolean shouldDisplayFolderRetentionRules() {
return !areDocumentRetentionRulesEnabled() || retentionRuleVO.getScope() != RetentionRuleScope.DOCUMENTS;
}
@Override
public boolean shouldDisplayDocumentRetentionRules() {
return areDocumentRetentionRulesEnabled();
}
@Override
public boolean shouldDisplayDefaultDocumentRetentionRules() {
return areDocumentRetentionRulesEnabled() && retentionRuleVO.getScope() != RetentionRuleScope.DOCUMENTS_AND_FOLDER;
}
@Override
public boolean shouldDisplayDocumentTypeDetails() {
return !areDocumentRetentionRulesEnabled();
}
@Override
protected boolean hasPageAccess(String params, User user) {
return user.has(RMPermissionsTo.MANAGE_RETENTIONRULE).globally();
}
private boolean areDocumentRetentionRulesEnabled() {
return new RMConfigs(modelLayerFactory.getSystemConfigurationsManager()).areDocumentRetentionRulesEnabled();
}
@Override
public CopyRetentionRule newDocumentCopyRetentionRule() {
return new CopyRetentionRule();
}
@Override
public CopyRetentionRule newFolderCopyRetentionRule(boolean principal) {
return new CopyRetentionRule();
}
@Override
public CopyRetentionRule newDocumentDefaultCopyRetentionRule(boolean principal) {
return new CopyRetentionRule();
}
@Override
public List<VariableRetentionPeriodVO> getOpenPeriodsDDVList() {
return getOpenActivePeriodsDDVList();
}
}