package com.constellio.app.modules.rm.ui.pages.decommissioning;
import com.constellio.app.modules.rm.ConstellioRMModule;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.extensions.api.DecommissioningListFolderTableExtension;
import com.constellio.app.modules.rm.extensions.api.RMModuleExtensions;
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.reports.builders.decommissioning.DecommissioningListReportParameters;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningEmailServiceException;
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.ui.builders.FolderDetailToVOBuilder;
import com.constellio.app.modules.rm.ui.entities.ContainerVO;
import com.constellio.app.modules.rm.ui.entities.FolderDetailVO;
import com.constellio.app.modules.rm.wrappers.ContainerRecord;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.structures.DecomListContainerDetail;
import com.constellio.app.modules.rm.wrappers.structures.DecomListValidation;
import com.constellio.app.modules.rm.wrappers.structures.FolderDetailWithType;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.components.NewReportPresenter;
import com.constellio.app.ui.framework.reports.NewReportWriterFactory;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.data.utils.TimeProvider;
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.RecordServicesException;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.*;
import static java.util.Arrays.asList;
public class DecommissioningListPresenter extends SingleSchemaBasePresenter<DecommissioningListView>
implements NewReportPresenter {
private transient RMSchemasRecordsServices rmRecordsServices;
private transient DecommissioningService decommissioningService;
private transient DecommissioningList decommissioningList;
private transient FolderDetailToVOBuilder folderDetailToVOBuilder;
String recordId;
public DecommissioningListPresenter(DecommissioningListView view) {
super(view, DecommissioningList.DEFAULT_SCHEMA);
}
public DecommissioningListPresenter forRecordId(String recordId) {
this.recordId = recordId;
return this;
}
@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());
}
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() {
HashMap<String, Double> sizeToBePlacedPerContainer = new HashMap<>();
RMSchemasRecordsServices rm = rmRecordsServices();
for(FolderDetailVO folder: getFoldersToValidate()) {
String newContainerRecordId = folder.getContainerRecordId();
Double newLinearSize = folder.getLinearSize();
if(StringUtils.isNotBlank(newContainerRecordId) && newLinearSize != null && sizeToBePlacedPerContainer.containsKey(newContainerRecordId)) {
sizeToBePlacedPerContainer.put(newContainerRecordId, sizeToBePlacedPerContainer.get(newContainerRecordId) + newLinearSize);
} else if(StringUtils.isNotBlank(newContainerRecordId) && newLinearSize != null && !sizeToBePlacedPerContainer.containsKey(newContainerRecordId)) {
sizeToBePlacedPerContainer.put(newContainerRecordId, newLinearSize);
}
Folder oldFolder = rm.getFolder(folder.getFolderId());
String oldContainerRecordId = oldFolder.getContainer();
Double oldLinearSize = oldFolder.getLinearSize();
if(StringUtils.isNotBlank(oldContainerRecordId) && oldLinearSize != null && sizeToBePlacedPerContainer.containsKey(oldContainerRecordId)) {
sizeToBePlacedPerContainer.put(oldContainerRecordId, sizeToBePlacedPerContainer.get(oldContainerRecordId) - oldLinearSize);
} else if(StringUtils.isNotBlank(oldContainerRecordId) && oldLinearSize != null && !sizeToBePlacedPerContainer.containsKey(oldContainerRecordId)) {
sizeToBePlacedPerContainer.put(oldContainerRecordId, oldLinearSize);
}
}
List<ContainerRecord> containersToValidate = rm.getContainerRecords(new ArrayList<String>(sizeToBePlacedPerContainer.keySet()));
for (ContainerRecord container: containersToValidate) {
if(container.getAvailableSize() < sizeToBePlacedPerContainer.get(container.getId())) {
view.showErrorMessage($("DecommissioningListView.notEnoughSpaceInContainer", container.getTitle()));
return;
}
}
if(!isListReadyToBeProcessed()) {
view.showErrorMessage($("DecommissioningListView.someFoldersAreBorrowed"));
return;
}
decommissioningService().decommission(decommissioningList(), getCurrentUser());
view.showMessage($(mayContainAnalogicalMedia() ?
"DecommissioningListView.processedWithReminder" : "DecommissioningListView.processed"));
view.navigate().to(RMViews.class).displayDecommissioningList(recordId);
}
public boolean isListReadyToBeProcessed() {
return !(searchServices().getResultsCount(from(rmRecordsServices().folder.schemaType()).where(rmRecordsServices().folder.borrowed()).isTrue()
.andWhere(Schemas.IDENTIFIER).isIn(decommissioningList().getFolders())) > 0);
}
public void validateButtonClicked() {
decommissioningList().getValidationFor(getCurrentUser().getId()).setValidationDate(TimeProvider.getLocalDate());
addOrUpdate(decommissioningList().getWrappedRecord());
view.navigate().to(RMViews.class).decommissioning();
}
public void approvalButtonClicked() {
decommissioningService().approveList(decommissioningList(), getCurrentUser());
// TODO: Do not hard-refresh the whole page
view.showMessage($("DecommissioningListView.approvalClicked"));
refreshView();
}
public void approvalRequestButtonClicked() {
try {
decommissioningService().approvalRequest(decommissioningList(), getCurrentUser());
view.showMessage($("DecommissioningListView.approvalRequestSent"));
refreshView();
} catch (DecommissioningEmailServiceException e) {
view.showErrorMessage($("DecommissioningListView.noManagerEmail"));
} catch (RecordServicesException e) {
view.showErrorMessage($("DecommissioningListView.approvalRequestNotSentCorrectly"));
}
}
public boolean isProcessed() {
return decommissioningList().isProcessed();
}
public boolean isApproved() {
return decommissioningList().isApproved();
}
public void containerCreationRequested() {
view.navigate().to(RMViews.class).createContainerForDecommissioningList(recordId);
}
public void containerSearchRequested() {
view.navigate().to(RMViews.class).searchContainerForDecommissioningList(recordId);
}
public void folderPlacedInContainer(FolderDetailVO folder, ContainerVO container) throws Exception {
Double containerAvailableSize = container.getAvailableSize();
Double folderLinearSize = folder.getLinearSize();
if(containerAvailableSize != null && folderLinearSize != null && containerAvailableSize < folderLinearSize) {
String messageToShow = $("DecommissioningListView.containerCannotContainFolder", folderLinearSize, containerAvailableSize);
view.showErrorMessage(messageToShow);
throw new Exception(messageToShow);
}
folder.setContainerRecordId(container.getId());
folder.setPackageable(false);
DecommissioningList decommissioningList = decommissioningList();
if(containerAvailableSize != null && folderLinearSize != null) {
containerAvailableSize = containerAvailableSize - folderLinearSize;
}
DecomListContainerDetail newContainerDetail = decommissioningList.getContainerDetail(container.getId());
if(newContainerDetail != null) {
newContainerDetail.setAvailableSize(containerAvailableSize);
}
decommissioningList.getFolderDetail(folder.getFolderId()).setFolderLinearSize(folderLinearSize).setContainerRecordId(container.getId()).setIsPlacedInContainer(true);
addOrUpdate(decommissioningList.getWrappedRecord());
view.addUpdateContainer(new ContainerVO(container.getId(), container.getCaption(), containerAvailableSize), newContainerDetail);
view.setProcessable(folder);
view.updateProcessButtonState(isProcessable());
}
public void folderSorted(FolderDetailVO folderVO, boolean value) {
folderVO.setReversedSort(value);
FolderDetailWithType folder = decommissioningList().getFolderDetailWithType(folderVO.getFolderId());
folder.getDetail().setReversedSort(value);
addOrUpdate(decommissioningList().getWrappedRecord());
if (decommissioningService().isFolderProcessable(decommissioningList(), folder)) {
folderVO.setPackageable(false);
view.setProcessable(folderVO);
} else {
folderVO.setPackageable(true);
view.setPackageable(folderVO);
}
view.updateProcessButtonState(isProcessable());
}
public void linearSizeUpdated(FolderDetailVO folder, Double linearSize) {
folder.setLinearSize(linearSize);
decommissioningList().getFolderDetail(folder.getFolderId()).setFolderLinearSize(linearSize);
addOrUpdate(decommissioningList().getWrappedRecord());
}
public Double getLinearSize(FolderDetailVO folder) {
return decommissioningList().getFolderDetail(folder.getFolderId()).getFolderLinearSize();
}
public void validationRemoved(DecomListValidation validation) {
addOrUpdate(decommissioningList().removeValidationRequest(validation).getWrappedRecord());
// TODO: Do not hard-refresh the whole page
view.showMessage($("DecommissioningListView.validatorRemoved"));
view.navigate().to(RMViews.class).displayDecommissioningList(recordId);
}
public void containerStatusChanged(DecomListContainerDetail detail, boolean full) {
detail.setFull(full);
addOrUpdate(decommissioningList().getWrappedRecord());
}
public List<DecomListValidation> getValidations() {
return decommissioningList().getValidations();
}
public List<FolderDetailVO> getFoldersToValidate() {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded()) {
result.add(builder.build(folder));
}
}
return result;
}
public List<FolderDetailVO> getPackageableFolders() {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && !decommissioningService().isFolderProcessable(decommissioningList(), folder) && !isFolderPlacedInContainer(folder)) {
result.add(builder.build(folder));
}
}
return result;
}
public List<FolderDetailVO> getProcessableFolders() {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && (decommissioningService().isFolderProcessable(decommissioningList(), folder) || isFolderPlacedInContainer(folder))) {
result.add(builder.build(folder));
}
}
return result;
}
protected boolean isFolderPlacedInContainer(FolderDetailWithType folder) {
return folder.getDetail().isPlacedInContainer();
}
public List<FolderDetailVO> getExcludedFolders() {
FolderDetailToVOBuilder builder = folderDetailToVOBuilder();
List<FolderDetailVO> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isExcluded()) {
result.add(builder.build(folder));
}
}
return result;
}
public List<String> getFoldersToValidateIds() {
List<String> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded()) {
result.add(folder.getFolderId());
}
}
return result;
}
public List<String> getPackageableFoldersIds() {
List<String> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && !decommissioningService().isFolderProcessable(decommissioningList(), folder) && !folder.getDetail().isPlacedInContainer()) {
result.add(folder.getFolderId());
}
}
return result;
}
public List<String> getProcessableFoldersIds() {
List<String> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isIncluded() && (decommissioningService().isFolderProcessable(decommissioningList(), folder) || folder.getDetail().isPlacedInContainer())) {
result.add(folder.getFolderId());
}
}
return result;
}
public List<String> getExcludedFoldersIds() {
List<String> result = new ArrayList<>();
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.isExcluded()) {
result.add(folder.getFolderId());
}
}
return result;
}
public List<DecomListContainerDetail> getContainerDetails() {
DecommissioningList decommissioningList = decommissioningList();
return decommissioningList.getContainerDetails();
}
public DecomListContainerDetail getContainerDetail(String containerId) {
DecommissioningList decommissioningList = decommissioningList();
return decommissioningList.getContainerDetail(containerId);
}
public List<ContainerVO> getContainers() {
List<ContainerVO> result = new ArrayList<>();
DecommissioningList decommissioningList = decommissioningList();
if (decommissioningList.getContainers().isEmpty()) {
return result;
}
Map<String, Double> usedSpaceMap = new HashMap<>();
for (FolderDetailVO folderDetailVO : getProcessableFolders()) {
String containerRecordId = folderDetailVO.getContainerRecordId();
Double linearSize = folderDetailVO.getLinearSize();
if(containerRecordId != null && linearSize != null) {
Double oldSize = usedSpaceMap.get(containerRecordId);
oldSize = oldSize == null? 0.0: oldSize;
usedSpaceMap.put(containerRecordId, oldSize + linearSize);
}
}
for (ContainerRecord container : rmRecordsServices.wrapContainerRecords(recordServices().getRecordsById(view.getCollection(), decommissioningList.getContainers()))) {
ContainerVO containerVO;
if(container.getAvailableSize() == null) {
containerVO = new ContainerVO(container.getId(), container.getTitle(), null);
} else {
Double usedSpace = usedSpaceMap.get(container.getId());
usedSpace = usedSpace == null? 0.0:usedSpace;
containerVO = new ContainerVO(container.getId(), container.getTitle(), container.getAvailableSize() - usedSpace);
}
decommissioningList.getContainerDetail(containerVO.getId()).setAvailableSize(containerVO.getAvailableSize());
result.add(containerVO);
}
// List<DecomListContainerDetail> containerDetails = decommissioningList.getContainerDetails();
// decommissioningList.setContainerDetails(containerDetails);
addOrUpdate(decommissioningList.getWrappedRecord());
this.decommissioningList = decommissioningList;
return result;
}
public String getSortAction() {
switch (decommissioningList().getDecommissioningListType()) {
case FOLDERS_TO_DEPOSIT:
return "destroy";
case FOLDERS_TO_DESTROY:
return "deposit";
}
return null;
}
public boolean shouldAllowContainerEditing() {
return decommissioningService().canEditContainers(decommissioningList(), getCurrentUser());
}
public boolean shouldDisplayRetentionRuleInDetails() {
return StringUtils.isBlank(decommissioningList().getUniformRule());
}
public boolean shouldDisplayCategoryInDetails() {
return StringUtils.isBlank(decommissioningList().getUniformCategory());
}
public boolean shouldDisplaySort() {
return decommissioningService().isSortable(decommissioningList());
}
public boolean shouldDisplayValidation() {
return !(decommissioningList().isApproved() || decommissioningList().isProcessed());
}
private boolean mayContainAnalogicalMedia() {
for (FolderDetailWithType folder : decommissioningList().getFolderDetailsWithType()) {
if (folder.getType().potentiallyHasAnalogMedium()) {
return true;
}
}
return false;
}
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;
}
FolderDetailToVOBuilder folderDetailToVOBuilder() {
if (folderDetailToVOBuilder == null) {
folderDetailToVOBuilder = new FolderDetailToVOBuilder(rmRecordsServices());
}
return folderDetailToVOBuilder;
}
public DecommissioningList decommissioningList() {
if (decommissioningList == null) {
decommissioningList = rmRecordsServices().getDecommissioningList(recordId);
}
return decommissioningList;
}
public void setValidationStatus(FolderDetailVO folder, Boolean valid) {
decommissioningList().getFolderDetail(folder.getFolderId()).setFolderExcluded(Boolean.FALSE.equals(valid));
addOrUpdate(decommissioningList().getWrappedRecord());
// TODO: Do not hard-refresh the whole page
refreshView();
}
public boolean validationRequested(List<String> users, String comments, boolean saveComment) {
if (users.contains(getCurrentUser().getId())) {
view.showErrorMessage($("DecommissioningListView.cannotSendValidationToItself"));
return false;
}
// TODO: Restore this functionality
// List<String> existingValidators = intersection(decommissioningList().getValidationRequests(), users);
// if (!existingValidators.isEmpty()) {
// view.showErrorMessage($("DecommissioningListView.validationAlreadySentToUsers") + " " +
// join(getUsersNames(existingValidators), ", "));
// return false;
// }
decommissioningService().sendValidationRequest(decommissioningList(), getCurrentUser(), users, comments, saveComment);
view.showMessage($("DecommissioningListView.validationMessageSent"));
refreshView();
return true;
}
private DecommissioningSecurityService securityService() {
return new DecommissioningSecurityService(collection, appLayerFactory);
}
public boolean canValidate() {
return decommissioningService().isValidationPossible(decommissioningList(), getCurrentUser());
}
public boolean canSendValidationRequest() {
return decommissioningService().isValidationRequestPossible(decommissioningList(), getCurrentUser());
}
public boolean canApprove() {
return decommissioningService().isApprovalPossible(decommissioningList(), getCurrentUser());
}
public boolean canSendApprovalRequest() {
return decommissioningService().isApprovalRequestPossible(decommissioningList(), getCurrentUser());
}
public void refreshView() {
view.navigate().to(RMViews.class).displayDecommissioningList(recordId);
}
public boolean canRemoveValidationRequest() {
return securityService().canAskValidation(decommissioningList(), getCurrentUser());
}
public void refreshList() {
decommissioningList = null;
}
public boolean isInValidation() {
return decommissioningList().getStatus() == DecomListStatus.IN_VALIDATION;
}
public boolean isValidationRequestedForCurrentUser() {
return decommissioningService().isValidationRequestedFor(decommissioningList(), getCurrentUser());
}
@Override
public List<String> getSupportedReports() {
return asList($("Reports.DecommissioningList"));
}
@Override
public NewReportWriterFactory getReport(String report) {
if (report.equals("Reports.DecommissioningList")) {
return getRmReportBuilderFactories().decommissioningListBuilderFactory.getValue();
} else {//Reports.documentsCertificate //Reports.foldersCertificate
throw new RuntimeException("BUG: Unknown report: " + report);
}
}
@Override
public Object getReportParameters(String report) {
return new DecommissioningListReportParameters(decommissioningList.getId());
}
public boolean isDocumentsCertificateButtonVisible() {
return decommissioningList().getDocumentsReportContent() != null;
}
public boolean isFoldersCertificateButtonVisible() {
return decommissioningList().getFoldersReportContent() != 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 String getFoldersReportContentId() {
if (decommissioningList().getFoldersReportContent() != null) {
return decommissioningList().getFoldersReportContent().getCurrentVersion().getHash();
} else {
return null;
}
}
public String getFoldersReportContentName() {
if (decommissioningList().getFoldersReportContent() != null) {
return decommissioningList().getFoldersReportContent().getCurrentVersion().getFilename();
} else {
return null;
}
}
public String getDeleteConfirmMessage() {
String deleteConfirmMessage;
if (decommissioningList().isApproved()) {
deleteConfirmMessage = $("DecommissioningListView.deleteApprovedList");
} else {
deleteConfirmMessage = $("DecommissioningListView.deleteList");
}
return deleteConfirmMessage;
}
public void addFoldersButtonClicked() {
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 removeFoldersButtonClicked(List<FolderDetailVO> selected) {
for(FolderDetailVO folderDetailVO: selected) {
decommissioningList().removeFolderDetail(folderDetailVO.getFolderId());
}
addOrUpdate(decommissioningList().getWrappedRecord());
refreshView();
}
public void autoFillContainersRequested(Map<String, Double> linearSize) {
linearSize = sortByValue(linearSize);
LogicalSearchQuery query = buildContainerQuery(linearSize.values().iterator().next());
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory);
//TODO CAN BE NULL
if(modelLayerFactory.newSearchServices().getResultsCount(query) == 0) {
view.showErrorMessage($("DecommissioningListView.noContainerFound"));
return;
}
List<ContainerRecord> containerRecordList = rm.wrapContainerRecords(modelLayerFactory.newSearchServices().search(query));
List<Map.Entry<String, Double>> listOfEntry = new LinkedList<>(linearSize.entrySet());
for(Map.Entry<String, Double> entry: listOfEntry) {
while(!containerRecordList.isEmpty() && !fill(containerRecordList.get(0), entry)) {
containerRecordList.remove(0);
}
}
}
protected boolean fill(ContainerRecord containerRecord, Map.Entry<String, Double> entry) {
recordServices().recalculate(containerRecord);
try {
folderPlacedInContainer(view.getPackageableFolder(entry.getKey()), view.getContainer(containerRecord));
} catch (Exception e) {
return false;
}
return true;
}
public LogicalSearchQuery buildContainerQuery(Double minimumSize) {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory);
return new LogicalSearchQuery(from(rm.containerRecord.schemaType()).whereAllConditions(
where(rm.containerRecord.administrativeUnit()).isEqualTo(decommissioningList().getAdministrativeUnit()),
where(rm.containerRecord.availableSize()).isGreaterOrEqualThan(minimumSize),
anyConditions(
where(rm.containerRecord.decommissioningType()).isEqualTo(decommissioningList().getDecommissioningListType().getDecommissioningType()),
where(rm.containerRecord.decommissioningType()).isNull()
)
)).sortAsc(rm.containerRecord.availableSize());
}
private Map<String, Double> sortByValue(Map<String, Double> linearSize) {
List<Map.Entry<String, Double>> listOfEntry = new LinkedList<>( linearSize.entrySet() );
Collections.sort(listOfEntry, new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Map.Entry<String, Double> entry1, Map.Entry<String, Double> entry2) {
return entry1.getValue().compareTo(entry2.getValue());
}
});
Map<String, Double> result = new LinkedHashMap<>();
for (Map.Entry<String, Double> entry : listOfEntry)
{
result.put( entry.getKey(), entry.getValue() );
}
return result;
}
public void addContainerToDecommissioningList(ContainerVO containerVO) {
try {
recordServices().update(decommissioningList().addContainerDetailsFrom(asList(rmRecordsServices.getContainerRecord(containerVO.getId()))));
} catch (RecordServicesException e) {
e.printStackTrace();
}
}
public void reorderRequested(OrderDecommissioningListPresenter.TableType type) {
view.navigate().to(RMViews.class).orderDecommissioningList(decommissioningList().getId(), type);
}
public String getOrderNumber(String folderId) {
int orderNumber = getExcludedFoldersIds().indexOf(folderId);
orderNumber = orderNumber == -1 ? getPackageableFoldersIds().indexOf(folderId) : orderNumber;
orderNumber = orderNumber == -1? getProcessableFoldersIds().indexOf(folderId) : orderNumber;
orderNumber = orderNumber == -1? getFoldersToValidateIds().indexOf(folderId) : orderNumber;
return String.valueOf(orderNumber + 1);
}
public boolean canCurrentUserManageStorageSpaces() {
return presenterService().getCurrentUser(view.getSessionContext()).has(RMPermissionsTo.MANAGE_CONTAINERS).globally();
}
public void removeFromContainer(FolderDetailVO detail) {
DecommissioningList decommissioningList = decommissioningList();
FolderDetailWithType folderDetailWithType = decommissioningList.getFolderDetailWithType(detail.getFolderId());
folderDetailWithType.getDetail().setIsPlacedInContainer(false);
try {
recordServices().update(decommissioningList);
} catch (RecordServicesException e) {
e.printStackTrace();
}
detail.setPackageable(decommissioningService().isFolderRemovableFromContainer(decommissioningList, decommissioningList.getFolderDetailWithType(detail.getFolderId())));
}
public DecommissioningListFolderTableExtension getFolderDetailTableExtension() {
RMModuleExtensions rmModuleExtensions = appCollectionExtentions.forModule(ConstellioRMModule.ID);
return rmModuleExtensions.getDecommissioningListFolderTableExtension();
}
}