package com.constellio.app.modules.rm.services.decommissioning; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.model.enums.DecommissioningListType; import com.constellio.app.modules.rm.model.enums.OriginStatus; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.ui.pages.decommissioning.DecommissioningMainPresenter; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.DecommissioningList; import com.constellio.app.modules.rm.wrappers.structures.DecomListValidation; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.taxonomies.TaxonomiesSearchServices; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; public class DecommissioningSecurityService { RMSchemasRecordsServices rm; TaxonomiesSearchServices taxonomiesSearchServices; SearchServices searchServices; DecommissioningService decommissioningService; public DecommissioningSecurityService(String collection, AppLayerFactory appLayerFactory) { this.rm = new RMSchemasRecordsServices(collection, appLayerFactory); this.taxonomiesSearchServices = appLayerFactory.getModelLayerFactory().newTaxonomiesSearchService(); this.searchServices = appLayerFactory.getModelLayerFactory().newSearchServices(); this.decommissioningService = new DecommissioningService(collection, appLayerFactory); } public boolean hasAccessToDecommissioningMainPage(User user) { if (user.hasAny(RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST, RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST).onSomething() || user.hasAny(RMPermissionsTo.CREATE_TRANSFER_DECOMMISSIONING_LIST, RMPermissionsTo.EDIT_TRANSFER_DECOMMISSIONING_LIST).globally()) { return true; } return searchServices.hasResults( from(rm.decommissioningList.schemaType()).where(rm.decommissioningList.pendingValidations()).isEqualTo(user)); } public boolean hasAccessToDecommissioningListPage(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list) || hasManageDecommissioningPermissionOnList(user, list) || hasPermissionToCreateTransferOnList(list, user) || canValidate(list, user); } private boolean hasProcessPermissionOnList(User user, DecommissioningList list) { return hasPermissionOnList(user, list, RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST); } private boolean hasManageDecommissioningPermissionOnList(User user, DecommissioningList list) { return hasPermissionOnList(user, list, RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST); } private boolean hasEditPermissionOnList(User user, DecommissioningList list) { return hasPermissionOnList(user, list, RMPermissionsTo.EDIT_DECOMMISSIONING_LIST) || hasPermissionToEditTransferOnList(list, user); } private boolean hasPermissionOnList(User user, DecommissioningList list, String permission) { AdministrativeUnit administrativeUnit = rm.getAdministrativeUnit(list.getAdministrativeUnit()); return user.has(permission).on(administrativeUnit); } public boolean canValidate(DecommissioningList list, User user) { DecomListValidation validation = list.getValidationFor(user.getId()); return validation != null && !validation.isValidated(); } public boolean canAskValidation(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list) || hasPermissionToCreateTransferOnList(list, user) || hasManageDecommissioningPermissionOnList(user, list); } public boolean canCreateLists(User user) { return user.has(RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST).onSomething() || user.has(RMPermissionsTo.CREATE_TRANSFER_DECOMMISSIONING_LIST).globally(); } public boolean canAskApproval(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list) || hasPermissionToCreateTransferOnList(list, user); } public boolean canApprove(DecommissioningList list, User user) { return hasManageDecommissioningPermissionOnList(user, list); } public boolean canModify(DecommissioningList list, User user) { return hasEditPermissionOnList(user, list) && list.isUnprocessed(); } public boolean canDelete(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list) && list.isUnprocessed(); } public boolean canProcess(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list); } public boolean canModifyFoldersAndContainers(DecommissioningList list, User user) { return hasProcessPermissionOnList(user, list); } public List<String> getVisibleTabsInDecommissioningMainPage(User user) { List<String> tabs; if (user.has(RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST).onSomething()) { tabs = new ArrayList<>(Arrays.asList( DecommissioningMainPresenter.CREATE, DecommissioningMainPresenter.GENERATED, DecommissioningMainPresenter.PENDING_VALIDATION, DecommissioningMainPresenter.TO_VALIDATE, DecommissioningMainPresenter.VALIDATED, DecommissioningMainPresenter.PENDING_APPROVAL, DecommissioningMainPresenter.TO_APPROVE, DecommissioningMainPresenter.APPROVED, DecommissioningMainPresenter.PROCESSED)); } else if (user.has(RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST).onSomething()) { tabs = new ArrayList<>(Arrays.asList( DecommissioningMainPresenter.PENDING_VALIDATION, DecommissioningMainPresenter.TO_VALIDATE, DecommissioningMainPresenter.VALIDATED, DecommissioningMainPresenter.TO_APPROVE)); } else { tabs = new ArrayList<>(Arrays.asList(DecommissioningMainPresenter.TO_VALIDATE)); } if(!tabs.contains(DecommissioningMainPresenter.CREATE) && user.has(RMPermissionsTo.CREATE_TRANSFER_DECOMMISSIONING_LIST).globally()) { tabs.add(0, DecommissioningMainPresenter.CREATE); } if(!tabs.contains(DecommissioningMainPresenter.GENERATED) && user.has(RMPermissionsTo.EDIT_TRANSFER_DECOMMISSIONING_LIST).globally()) { if(tabs.contains(DecommissioningMainPresenter.CREATE)) { tabs.add(1, DecommissioningMainPresenter.GENERATED); } else { tabs.add(0, DecommissioningMainPresenter.GENERATED); } } return tabs; } public boolean canCreateContainers(User user) { return user.has(RMPermissionsTo.MANAGE_CONTAINERS).globally(); } public boolean hasAccessToManageContainersPage(User user) { return user.has(RMPermissionsTo.MANAGE_CONTAINERS).globally(); } public boolean hasPermissionToCreateTransferOnList(DecommissioningList list, User user) { if(isListOfSearchTypeTransfer(list) && list.hasAnalogicalMedium() && !list.hasElectronicMedium()) { return user.has(RMPermissionsTo.CREATE_TRANSFER_DECOMMISSIONING_LIST).globally(); } return false; } public boolean hasPermissionToEditTransferOnList(DecommissioningList list, User user) { if(isListOfSearchTypeTransfer(list) && list.hasAnalogicalMedium() && !list.hasElectronicMedium()) { return user.has(RMPermissionsTo.EDIT_TRANSFER_DECOMMISSIONING_LIST).globally(); } return false; } public boolean isListOfSearchTypeTransfer(DecommissioningList list) { return DecommissioningListType.FOLDERS_TO_TRANSFER.equals(list.getDecommissioningListType()) && OriginStatus.ACTIVE.equals(list.getOriginArchivisticStatus()); } }