package com.constellio.app.modules.rm.wrappers;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.enums.CopyType;
import com.constellio.app.modules.rm.model.enums.DisposalType;
import com.constellio.app.modules.rm.model.enums.RetentionRuleScope;
import com.constellio.app.modules.rm.wrappers.structures.RetentionRuleDocumentType;
import com.constellio.data.utils.ImpossibleRuntimeException;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.RecordWrapper;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import org.joda.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RetentionRule extends RecordWrapper {
public static final String SCHEMA_TYPE = "retentionRule";
public static final String DEFAULT_SCHEMA = SCHEMA_TYPE + "_default";
public static final String CODE = "code";
public static final String ADMINISTRATIVE_UNITS = "administrativeUnits";
public static final String COPY_RETENTION_RULES = "copyRetentionRules";
public static final String RESPONSIBLE_ADMINISTRATIVE_UNITS = "responsibleAdministrativeUnits";
public static final String APPROVED = "approved";
public static final String APPROVAL_DATE = "approvalDate";
public static final String DOCUMENT_TYPES = "documentTypes";
public static final String FOLDER_TYPES = "folderTypes";
public static final String DOCUMENT_TYPES_DETAILS = "documentTypesDetails";
public static final String KEYWORDS = "keywords";
public static final String CORPUS = "corpus";
public static final String CORPUS_RULE_NUMBER = "corpusRuleNumber";
public static final String COPY_RULES_COMMENT = "copyRulesComment";
public static final String DESCRIPTION = "description";
public static final String JURIDIC_REFERENCE = "juridicReference";
public static final String GENERAL_COMMENT = "generalComment";
public static final String HISTORY = "history";
public static final String ESSENTIAL_DOCUMENTS = "essentialDocuments";
public static final String CONFIDENTIAL_DOCUMENTS = "confidentialDocuments";
public static final String DOCUMENT_COPY_RETENTION_RULES = "documentCopyRetentionRules";
public static final String PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE = "principalDefaultDocumentCopyRetentionRule";
public static final String SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE = "secondaryDefaultDocumentCopyRetentionRule";
public static final String SCOPE = "scope";
public RetentionRule(Record record,
MetadataSchemaTypes types) {
super(record, types, SCHEMA_TYPE);
}
public RetentionRule setTitle(String title) {
super.setTitle(title);
return this;
}
public String getCode() {
return get(CODE);
}
public RetentionRule setCode(String code) {
set(CODE, code);
return this;
}
public boolean isResponsibleAdministrativeUnits() {
return getBooleanWithDefaultValue(RESPONSIBLE_ADMINISTRATIVE_UNITS, false);
}
public RetentionRule setResponsibleAdministrativeUnits(boolean responsibleAdministrativeUnits) {
set(RESPONSIBLE_ADMINISTRATIVE_UNITS, responsibleAdministrativeUnits);
return this;
}
public boolean isApproved() {
return getBooleanWithDefaultValue(APPROVED, false);
}
public RetentionRule setApproved(boolean approved) {
set(APPROVED, approved);
return this;
}
public LocalDate getApprovalDate() {
return get(APPROVAL_DATE);
}
public RetentionRule setApprovalDate(LocalDate approvalDate) {
set(APPROVAL_DATE, approvalDate);
return this;
}
public List<String> getDocumentTypes() {
return getList(DOCUMENT_TYPES);
}
public List<String> getFolderTypes() {
return getList(FOLDER_TYPES);
}
public List<RetentionRuleDocumentType> getDocumentTypesDetails() {
return getList(DOCUMENT_TYPES_DETAILS);
}
public RetentionRule setDocumentTypesDetails(List<RetentionRuleDocumentType> documentTypesDetails) {
set(DOCUMENT_TYPES_DETAILS, documentTypesDetails);
return this;
}
public List<String> getKeywords() {
return getList(KEYWORDS);
}
public RetentionRule setKeywords(List<String> keywords) {
set(KEYWORDS, keywords);
return this;
}
public String getCorpus() {
return get(CORPUS);
}
public RetentionRule setCorpus(String corpus) {
set(CORPUS, corpus);
return this;
}
public String getCorpusRuleNumber() {
return get(CORPUS_RULE_NUMBER);
}
public RetentionRule setCorpusRuleNumber(String corpusRuleNumber) {
set(CORPUS_RULE_NUMBER, corpusRuleNumber);
return this;
}
public List<String> getCopyRulesComment() {
return get(COPY_RULES_COMMENT);
}
public RetentionRule setCopyRulesComment(List<String> copyRulesComments) {
set(COPY_RULES_COMMENT, copyRulesComments);
return this;
}
public String getDescription() {
return get(DESCRIPTION);
}
public RetentionRule setDescription(String description) {
set(DESCRIPTION, description);
return this;
}
public String getJuridicReference() {
return get(JURIDIC_REFERENCE);
}
public RetentionRule setJuridicReference(String juridicReference) {
set(JURIDIC_REFERENCE, juridicReference);
return this;
}
public String getGeneralComment() {
return get(GENERAL_COMMENT);
}
public RetentionRule setGeneralComment(String generalComment) {
set(GENERAL_COMMENT, generalComment);
return this;
}
public List<String> getAdministrativeUnits() {
return getList(ADMINISTRATIVE_UNITS);
}
public RetentionRule setAdministrativeUnits(List<?> administrativeUnits) {
set(ADMINISTRATIVE_UNITS, administrativeUnits);
return this;
}
public List<CopyRetentionRule> getCopyRetentionRules() {
return getList(COPY_RETENTION_RULES);
}
public CopyRetentionRule getCopyRetentionRuleWithCode(String code) {
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (code.equals(copyRetentionRule.getCode())) {
return copyRetentionRule;
}
}
return null;
}
public CopyRetentionRule getCopyRetentionRuleByString(String copyRule) {
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (copyRule.equals(copyRetentionRule.toString())) {
return copyRetentionRule;
}
}
return null;
}
public RetentionRule setCopyRetentionRules(CopyRetentionRule... copyRetentionRules) {
return setCopyRetentionRules(Arrays.asList(copyRetentionRules));
}
public RetentionRule setCopyRetentionRules(List<CopyRetentionRule> copyRetentionRules) {
set(COPY_RETENTION_RULES, copyRetentionRules);
return this;
}
public CopyRetentionRule getSecondaryCopy() {
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (copyRetentionRule.getCopyType() == CopyType.SECONDARY) {
return copyRetentionRule;
}
}
return null;
}
public List<CopyRetentionRule> getPrincipalCopies() {
List<CopyRetentionRule> principalCopies = new ArrayList<>();
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (copyRetentionRule.getCopyType() == CopyType.PRINCIPAL) {
principalCopies.add(copyRetentionRule);
}
}
return principalCopies;
}
public String getHistory() {
return get(HISTORY);
}
public RetentionRule setHistory(String history) {
set(HISTORY, history);
return this;
}
public boolean isEssentialDocuments() {
return getBooleanWithDefaultValue(ESSENTIAL_DOCUMENTS, false);
}
public RetentionRule setEssentialDocuments(boolean essential) {
set(ESSENTIAL_DOCUMENTS, essential);
return this;
}
public boolean isConfidentialDocuments() {
return getBooleanWithDefaultValue(CONFIDENTIAL_DOCUMENTS, false);
}
public RetentionRule setConfidentialDocuments(boolean confidential) {
set(CONFIDENTIAL_DOCUMENTS, confidential);
return this;
}
private CopyRetentionRule getSecondaryCopyRetentionRule() {
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (copyRetentionRule.getCopyType() == CopyType.SECONDARY) {
return copyRetentionRule;
}
}
throw new ImpossibleRuntimeException("Retention rule has no secondary copy retention rule");
}
public final boolean hasCopyRetentionRuleWithSortDispositionType() {
for (CopyRetentionRule copyRetentionRule : getCopyRetentionRules()) {
if (DisposalType.SORT == copyRetentionRule.getInactiveDisposalType()) {
return true;
}
}
return false;
}
public static class RetentionRuleRuntimeException extends RuntimeException {
public RetentionRuleRuntimeException(String message) {
super(message);
}
}
public List<CopyRetentionRule> getDocumentCopyRetentionRules() {
return getList(DOCUMENT_COPY_RETENTION_RULES);
}
public RetentionRule setDocumentCopyRetentionRules(CopyRetentionRule... documentCopyRetentionRules) {
return setDocumentCopyRetentionRules(Arrays.asList(documentCopyRetentionRules));
}
public RetentionRule setDocumentCopyRetentionRules(List<CopyRetentionRule> copyRetentionRules) {
set(DOCUMENT_COPY_RETENTION_RULES, copyRetentionRules);
return this;
}
public CopyRetentionRule getPrincipalDefaultDocumentCopyRetentionRule() {
return get(PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE);
}
public RetentionRule setPrincipalDefaultDocumentCopyRetentionRule(
CopyRetentionRule principalDefaultDocumentCopyRetentionRule) {
set(PRINCIPAL_DEFAULT_DOCUMENT_COPY_RETENTION_RULE, principalDefaultDocumentCopyRetentionRule);
return this;
}
public CopyRetentionRule getSecondaryDefaultDocumentCopyRetentionRule() {
return get(SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE);
}
public RetentionRule setSecondaryDefaultDocumentCopyRetentionRule(
CopyRetentionRule secondaryDefaultDocumentCopyRetentionRule) {
set(SECONDARY_DEFAULT_DOCUMENT_COPY_RETENTION_RULE, secondaryDefaultDocumentCopyRetentionRule);
return this;
}
public RetentionRuleScope getScope() {
return get(SCOPE);
}
public RetentionRule setScope(RetentionRuleScope scope) {
set(SCOPE, scope);
return this;
}
public RetentionRule setDecommissioningType(RetentionRuleScope retentionRuleScope) {
set(SCOPE, retentionRuleScope);
return this;
}
public static RetentionRule wrap(Record record, MetadataSchemaTypes types) {
return record == null ? null : new RetentionRule(record, types);
}
}