package com.constellio.app.modules.rm.ui.pages.decommissioning; import com.constellio.app.modules.rm.model.enums.DecomListStatus; import com.constellio.app.modules.rm.model.enums.OriginStatus; import com.constellio.app.modules.rm.navigation.RMViews; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningSecurityService; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService; import com.constellio.app.modules.rm.services.decommissioning.SearchType; import com.constellio.app.modules.rm.wrappers.DecommissioningList; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.ui.entities.MetadataSchemaVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.entities.RecordVO.VIEW_MODE; import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder; import com.constellio.app.ui.framework.builders.RecordToVOBuilder; import com.constellio.app.ui.framework.data.RecordVODataProvider; 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.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import java.util.*; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; public class DocumentDecommissioningListPresenter extends SingleSchemaBasePresenter<DocumentDecommissioningListView> { private transient RMSchemasRecordsServices rmRecordsServices; private transient DecommissioningService decommissioningService; private transient DecommissioningList decommissioningList; String recordId; public DocumentDecommissioningListPresenter(DocumentDecommissioningListView view) { super(view, DecommissioningList.DEFAULT_SCHEMA); } public DocumentDecommissioningListPresenter forRecordId(String recordId) { this.recordId = recordId; return this; } public RecordVODataProvider getDocuments() { MetadataSchemaVO schema = new MetadataSchemaToVOBuilder().build( schema(Document.DEFAULT_SCHEMA), VIEW_MODE.TABLE, view.getSessionContext()); return new RecordVODataProvider(schema, new RecordToVOBuilder(), modelLayerFactory, view.getSessionContext()) { @Override protected LogicalSearchQuery getQuery() { LogicalSearchCondition condition = from(rmRecordsServices().documentSchemaType()) .where(Schemas.IDENTIFIER).isIn(decommissioningList().getDocuments()); return new LogicalSearchQuery(condition); } }; } public boolean isProcessed() { return decommissioningList().isProcessed(); } public boolean isApproved() { return decommissioningList().isApproved(); } public boolean isInValidation() { return decommissioningList().getStatus() == DecomListStatus.IN_VALIDATION; } public boolean isEditable() { return decommissioningService().isEditable(decommissioningList(), getCurrentUser()); } public void editButtonClicked() { view.navigate().to(RMViews.class).editDecommissioningList(recordId); } public boolean isDeletable() { return decommissioningService().isDeletable(decommissioningList(), getCurrentUser()); } public void deleteButtonClicked() { delete(decommissioningList().getWrappedRecord()); view.navigate().to(RMViews.class).decommissioning(); } public boolean isProcessable() { return decommissioningService().isProcessable(decommissioningList(), getCurrentUser()); } public void processButtonClicked() { decommissioningService().decommission(decommissioningList(), getCurrentUser()); view.showMessage($("DecommissioningListView.processed")); view.navigate().to(RMViews.class).displayDocumentDecommissioningList(recordId); } public boolean isDocumentsCertificateButtonVisible() { return decommissioningList().getDocumentsReportContent() != null; } public String getDocumentsReportContentId() { if (decommissioningList().getDocumentsReportContent() != null) { return decommissioningList().getDocumentsReportContent().getCurrentVersion().getHash(); } else { return null; } } public String getDocumentsReportContentName() { if (decommissioningList().getDocumentsReportContent() != null) { return decommissioningList().getDocumentsReportContent().getCurrentVersion().getFilename(); } else { return null; } } public void refreshList() { decommissioningList = null; } @Override protected boolean hasPageAccess(String params, User user) { return true; } @Override protected List<String> getRestrictedRecordIds(String params) { return Arrays.asList(params); } @Override protected boolean hasRestrictedRecordAccess(String params, User user, Record restrictedRecord) { DecommissioningList decommissioningList = rmRecordsServices().wrapDecommissioningList(restrictedRecord); return securityService().hasAccessToDecommissioningListPage(decommissioningList, user); } public RecordVO getDecommissioningList() { return presenterService().getRecordVO(recordId, VIEW_MODE.DISPLAY, view.getSessionContext()); } DecommissioningService decommissioningService() { if (decommissioningService == null) { decommissioningService = new DecommissioningService(view.getCollection(), appLayerFactory); } return decommissioningService; } RMSchemasRecordsServices rmRecordsServices() { if (rmRecordsServices == null) { rmRecordsServices = new RMSchemasRecordsServices(view.getCollection(), appLayerFactory); } return rmRecordsServices; } public DecommissioningList decommissioningList() { if (decommissioningList == null) { decommissioningList = rmRecordsServices().getDecommissioningList(recordId); } return decommissioningList; } private DecommissioningSecurityService securityService() { return new DecommissioningSecurityService(collection, appLayerFactory); } public void refreshView() { view.navigate().to(RMViews.class).displayDocumentDecommissioningList(recordId); } public void addDocumentsButtonClicked() { if(calculateSearchType() != null) { view.navigate().to(RMViews.class).editDecommissioningListBuilder(recordId, calculateSearchType().toString()); } } public SearchType calculateSearchType() { if(decommissioningList().getOriginArchivisticStatus().equals(OriginStatus.ACTIVE)) { switch (decommissioningList().getDecommissioningListType()) { case FOLDERS_TO_DEPOSIT: return SearchType.activeToDeposit; case FOLDERS_TO_DESTROY: return SearchType.activeToDestroy; case FOLDERS_TO_TRANSFER: return SearchType.transfer; case DOCUMENTS_TO_DEPOSIT: return SearchType.documentActiveToDeposit; case DOCUMENTS_TO_DESTROY: return SearchType.documentActiveToDestroy; case DOCUMENTS_TO_TRANSFER: return SearchType.documentTransfer; } } else if(decommissioningList().getOriginArchivisticStatus().equals(OriginStatus.SEMI_ACTIVE)) { switch (decommissioningList().getDecommissioningListType()) { case FOLDERS_TO_DEPOSIT: return SearchType.semiActiveToDeposit; case FOLDERS_TO_DESTROY: return SearchType.semiActiveToDestroy; case DOCUMENTS_TO_DEPOSIT: return SearchType.documentSemiActiveToDeposit; case DOCUMENTS_TO_DESTROY: return SearchType.documentSemiActiveToDestroy; } } return null; } public void removeDocumentsButtonClicked(HashMap<Integer, Boolean> selected) { Set<String> idsToRemove = new HashSet<>(); for(Map.Entry<Integer, Boolean> entry: selected.entrySet()) { if(Boolean.TRUE.equals(entry.getValue())) { RecordVO recordVO = getDocuments().getRecordVO(entry.getKey()); idsToRemove.add(recordVO.getId()); } } decommissioningList().removeDocuments(idsToRemove.toArray(new String[idsToRemove.size()])); addOrUpdate(decommissioningList().getWrappedRecord()); refreshView(); } }