package com.constellio.app.modules.rm.model; import static com.constellio.app.modules.rm.model.enums.CopyType.PRINCIPAL; import static com.constellio.app.modules.rm.model.enums.DecommissioningDateBasedOn.CLOSE_DATE; import static com.constellio.app.modules.rm.model.enums.FolderStatus.ACTIVE; import static com.constellio.app.modules.rm.model.enums.FolderStatus.INACTIVE_DEPOSITED; import static com.constellio.app.modules.rm.model.enums.FolderStatus.INACTIVE_DESTROYED; import static com.constellio.app.modules.rm.model.enums.FolderStatus.SEMI_ACTIVE; import static com.constellio.app.modules.rm.model.validators.FolderValidator.CATEGORY_CODE; import static com.constellio.app.modules.rm.model.validators.FolderValidator.RULE_CODE; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.sdk.tests.TestUtils.assertThatRecord; import static com.constellio.sdk.tests.TestUtils.extractingSimpleCodeAndParameters; import static com.constellio.sdk.tests.TestUtils.frenchMessages; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.constants.RMTaxonomies; import com.constellio.app.modules.rm.model.enums.AllowModificationOfArchivisticStatusAndExpectedDatesChoice; import com.constellio.app.modules.rm.model.enums.CompleteDatesWhenAddingFolderWithManualStatusChoice; import com.constellio.app.modules.rm.model.enums.CopyType; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.Category; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.app.modules.rm.wrappers.structures.Comment; import com.constellio.app.modules.rm.wrappers.type.FolderType; import com.constellio.data.utils.Builder; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.ReferenceDependency; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.extensions.behaviors.RecordExtension; import com.constellio.model.extensions.events.records.RecordInCreationBeforeSaveEvent; import com.constellio.model.extensions.events.records.RecordInModificationBeforeSaveEvent; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestUtils; import com.constellio.sdk.tests.setups.Users; public class FolderAcceptanceTest extends ConstellioTest { Users users = new Users(); LocalDate november4_2009 = new LocalDate(2009, 11, 4); LocalDate november4_2010 = new LocalDate(2010, 11, 4); LocalDate december12_2009 = new LocalDate(2009, 12, 12); LocalDate january12_2010 = new LocalDate(2010, 1, 12); LocalDate february16_2012 = new LocalDate(2012, 1, 12); LocalDate january1_2015 = new LocalDate(2015, 1, 1); LocalDate february2_2015 = new LocalDate(2015, 2, 1); LocalDate february11_2015 = new LocalDate(2015, 2, 11); LocalDate march31_2015 = new LocalDate(2015, 3, 31); LocalDate march31_2016 = new LocalDate(2016, 3, 31); LocalDate march31_2017 = new LocalDate(2017, 3, 31); LocalDate march31_2018 = new LocalDate(2018, 3, 31); LocalDate march31_2019 = new LocalDate(2019, 3, 31); LocalDate march31_2020 = new LocalDate(2020, 3, 31); LocalDate march31_2021 = new LocalDate(2021, 3, 31); LocalDate march31_2022 = new LocalDate(2022, 3, 31); LocalDate march31_2023 = new LocalDate(2023, 3, 31); LocalDate march31_2024 = new LocalDate(2024, 3, 31); LocalDate march31_2025 = new LocalDate(2025, 3, 31); LocalDate april1_2004 = new LocalDate(2004, 4, 1); LocalDate april1_2014 = new LocalDate(2014, 4, 1); LocalDate march31_2005 = new LocalDate(2005, 3, 31); LocalDate march31_2026 = new LocalDate(2026, 3, 31); LocalDate march31_2029 = new LocalDate(2029, 3, 31); LocalDate march31_2035 = new LocalDate(2035, 3, 31); LocalDate march31_2036 = new LocalDate(2036, 3, 31); LocalDate march31_2046 = new LocalDate(2046, 3, 31); LocalDate march31_2056 = new LocalDate(2056, 3, 31); LocalDate march31_2061 = new LocalDate(2061, 3, 31); LocalDate march31_2065 = new LocalDate(2065, 3, 31); LocalDate march31_2066 = new LocalDate(2066, 3, 31); LocalDate march31_2075 = new LocalDate(2075, 3, 31); RMSchemasRecordsServices rm; RMTestRecords records = new RMTestRecords(zeCollection); RecordServices recordServices; Transaction transaction = new Transaction(); String zeRule = "zeRule"; String zeCategory; String aPrincipalAdminUnit; String anotherPrincipalAdminUnit; String aSecondaryAdminUnit; String PA; String MV; String MD; CopyType noEnteredCopyType = null; CopyRetentionRuleBuilder copyBuilder = new CopyRetentionRuleBuilderWithDefinedIds(); @Before public void setUp() throws Exception { givenRollbackCheckDisabled(); givenDisabledAfterTestValidations(); prepareSystem( withZeCollection().withConstellioRMModule().withRMTest(records).withAllTest(users) ); assertThat(getModelLayerFactory().getTaxonomiesManager().getPrincipalTaxonomy(zeCollection).getCode()) .isEqualTo(RMTaxonomies.ADMINISTRATIVE_UNITS); rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); recordServices = getModelLayerFactory().newRecordServices(); zeCategory = records.categoryId_ZE42; aPrincipalAdminUnit = records.unitId_10a; anotherPrincipalAdminUnit = records.unitId_20; aSecondaryAdminUnit = records.unitId_30; PA = records.PA; MV = records.MV; MD = records.MD; } @Test public void givenEnforcedWhenCreateFolderWithIncompatibleRuleAndCategoryThenValidationException() throws Exception { givenConfig(RMConfigs.UNIFORM_SUBDIVISION_ENABLED, true); givenConfig(RMConfigs.ENFORCE_CATEGORY_AND_RULE_RELATIONSHIP_IN_FOLDER, true); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_11b); folder.setCategoryEntered(records.categoryId_X); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setTitle("Ze folder"); folder.setOpenDate(LocalDate.now()); try { recordServices.add(folder); fail("Validation exception expected"); } catch (RecordServicesException.ValidationException e) { assertThat(extractingSimpleCodeAndParameters(e, CATEGORY_CODE, RULE_CODE)).containsOnly( tuple("FolderValidator_folderCategoryMustBeRelatedToItsRule", "X", "2") ); } givenConfig(RMConfigs.ENFORCE_CATEGORY_AND_RULE_RELATIONSHIP_IN_FOLDER, false); //OK recordServices.add(folder); } @Test public void givenEnforcedWhenCreateFolderWithIncompatibleRuleAndUniformSubdivisionThenValidationException() throws Exception { givenConfig(RMConfigs.UNIFORM_SUBDIVISION_ENABLED, true); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_11b); folder.setCategoryEntered(records.categoryId_X); folder.setRetentionRuleEntered(records.ruleId_1); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setTitle("Ze folder"); folder.setOpenDate(LocalDate.now()); folder.setUniformSubdivisionEntered(records.subdivId_1); try { recordServices.add(folder); fail("Validation exception expected"); } catch (RecordServicesException.ValidationException e) { assertThat(extractingSimpleCodeAndParameters(e, CATEGORY_CODE, RULE_CODE)).containsOnly( tuple("FolderValidator_folderUniformSubdivisionMustBeRelatedToItsRule", "sub1", "1") ); assertThat(frenchMessages(e)).containsOnly("La subdivision uniforme d''un dossier doit être liée à sa règle"); } givenConfig(RMConfigs.UNIFORM_SUBDIVISION_ENABLED, false); //OK recordServices.add(folder); } @Test public void givenEnforcedWhenCreateFolderWithCompatibleRuleAndUniformSubdivisionThenNoValidationException() throws Exception { givenConfig(RMConfigs.UNIFORM_SUBDIVISION_ENABLED, true); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_11b); folder.setCategoryEntered(records.categoryId_X); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setTitle("Ze folder"); folder.setOpenDate(LocalDate.now()); folder.setUniformSubdivisionEntered(records.subdivId_1); recordServices.add(folder); } @Test public void whenSaveFolderThenMetadataValuesSaved() throws Exception { Comment comment1 = new Comment("Ze message", records.getDakota_managerInA_userInB(), new LocalDateTime().minusWeeks(4)); Comment comment2 = new Comment("An other message", records.getEdouard_managerInB_userInC(), new LocalDateTime().minusWeeks(1)); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_11b); folder.setDescription("Ze description"); folder.setCategoryEntered(records.categoryId_X110); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setTitle("Ze folder"); folder.setMediumTypes(Arrays.asList(PA, MV)); folder.setUniformSubdivisionEntered(records.subdivId_2); folder.setOpenDate(november4_2009); folder.setCloseDateEntered(december12_2009); folder.setComments(asList(comment1, comment2)); FolderStatus manualArchivisticStatus = FolderStatus.INACTIVE_DEPOSITED; LocalDate manualDepositDate = january1_2015, manualTransferDate = march31_2005, manualDestructionDate = march31_2016; folder.setManualArchivisticStatus(manualArchivisticStatus); folder.setManualExpectedDepositDate(manualDepositDate); folder.setManualExpectedTransferDate(manualTransferDate); folder.setManualExpectedDestructionDate(manualDestructionDate); folder = saveAndLoad(folder); assertThat(folder.getAdministrativeUnitEntered()).isEqualTo(records.unitId_11b); assertThat(folder.getDescription()).isEqualTo("Ze description"); assertThat(folder.getUniformSubdivisionEntered()).isEqualTo(records.subdivId_2); assertThat(folder.getCategoryEntered()).isEqualTo(records.categoryId_X110); assertThat(folder.getCategoryCode()).isEqualTo(records.getCategory_X110().getCode()); assertThat(folder.getRetentionRuleEntered()).isEqualTo(records.ruleId_2); assertThat(folder.getActiveRetentionCode()).isNull(); assertThat(folder.getSemiActiveRetentionCode()).isNull(); assertThat(folder.getRetentionRuleEntered()).isEqualTo(records.ruleId_2); assertThat(folder.getCopyStatus()).isEqualTo(CopyType.PRINCIPAL); assertThat(folder.getTitle()).isEqualTo("Ze folder"); assertThat(folder.getMediumTypes()).isEqualTo(Arrays.asList(PA, MV)); assertThat(folder.getOpenDate()).isEqualTo(november4_2009); assertThat(folder.getComments()).isEqualTo(asList(comment1, comment2)); assertThat(folder.hasAnalogicalMedium()).isTrue(); assertThat(folder.hasElectronicMedium()).isFalse(); assertThat(folder.getCloseDateEntered()).isEqualTo(december12_2009); assertThat(folder.getManualArchivisticStatus()).isEqualTo(manualArchivisticStatus); assertThat(folder.getManualExpecteTransferdDate()).isEqualTo(manualTransferDate); assertThat(folder.getManualExpectedDepositDate()).isEqualTo(manualDepositDate); assertThat(folder.getManualExpectedDestructionDate()).isEqualTo(manualDestructionDate); } @Test public void givenChildFolderWhenChangingEnteredValuesThenSetBackToNullBeforeSave() throws Exception { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_11b); folder.setDescription("Ze description"); folder.setCategoryEntered(records.categoryId_X110); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setTitle("Ze folder"); folder.setMediumTypes(Arrays.asList(PA, MV)); folder.setUniformSubdivisionEntered(records.subdivId_2); folder.setOpenDate(november4_2009); folder.setCloseDateEntered(december12_2009); folder = saveAndLoad(folder); Folder childFolder = rm.newFolder(); childFolder.setParentFolder(folder); childFolder.setOpenDate(november4_2009); childFolder.setTitle("Ze child folder"); childFolder = saveAndLoad(childFolder); childFolder.setAdministrativeUnitEntered(records.unitId_10); childFolder.setCategoryEntered(records.categoryId_X); childFolder.setRetentionRuleEntered(records.ruleId_3); childFolder.setCopyStatusEntered(CopyType.SECONDARY); childFolder = saveAndLoad(childFolder); assertThat(childFolder.getAdministrativeUnitEntered()).isNull(); assertThat(childFolder.getCategoryEntered()).isNull(); assertThat(childFolder.getRetentionRuleEntered()).isNull(); assertThat(childFolder.getCopyStatusEntered()).isNull(); } @Test public void givenFolderWithFormCreatedModifiedByOnInfosThenPersisted() throws RecordServicesException { LocalDateTime dateTime1 = new LocalDateTime().plusDays(1); LocalDateTime dateTime2 = dateTime1.plusDays(2); Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009) .setFormCreatedBy(records.getBob_userInAC().getId()) .setFormCreatedOn(dateTime1) .setFormModifiedBy(records.getCharles_userInA().getId()) .setFormModifiedOn(dateTime2)); assertThat(folder.getFormCreatedBy()).isEqualTo(records.getBob_userInAC().getId()); assertThat(folder.getFormCreatedOn()).isEqualTo(dateTime1); assertThat(folder.getFormModifiedBy()).isEqualTo(records.getCharles_userInA().getId()); assertThat(folder.getFormModifiedOn()).isEqualTo(dateTime2); } @Test public void givenFolderWithoutTransferDisposalAndDestructionDatesThenActive() throws RecordServicesException { Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009)); assertThat(folder.hasAnalogicalMedium()).isTrue(); assertThat(folder.hasElectronicMedium()).isTrue(); assertThat(folder.getOpenDate()).isEqualTo(november4_2009); assertThat(folder.getCloseDateEntered()).isEqualTo(december12_2009); assertThat(folder.getArchivisticStatus()).isEqualTo(ACTIVE); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); } @Test public void givenFolderWithTransferDateAndWithoutDestructionOrDepositThenSemiActive() throws Exception { Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009) .setActualTransferDate(january12_2010)); assertThat(folder.getOpenDate()).isEqualTo(november4_2009); assertThat(folder.getCloseDateEntered()).isEqualTo(december12_2009); assertThat(folder.getArchivisticStatus()).isEqualTo(SEMI_ACTIVE); assertThat(folder.getActualTransferDate()).isEqualTo(january12_2010); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); } @Test public void givenFolderWithDepositDateThenInactive() throws Exception { Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009) .setActualTransferDate(january12_2010) .setActualDepositDate(february16_2012)); assertThat(folder.getOpenDate()).isEqualTo(november4_2009); assertThat(folder.getCloseDateEntered()).isEqualTo(december12_2009); assertThat(folder.getArchivisticStatus()).isEqualTo(INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isEqualTo(january12_2010); assertThat(folder.getActualDepositDate()).isEqualTo(february16_2012); assertThat(folder.getActualDestructionDate()).isNull(); } @Test public void givenFolderWithDestructionDateThenInactive() throws Exception { Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009) .setActualTransferDate(january12_2010) .setActualDestructionDate(february16_2012)); assertThat(folder.getOpenDate()).isEqualTo(november4_2009); assertThat(folder.getCloseDateEntered()).isEqualTo(december12_2009); assertThat(folder.getArchivisticStatus()).isEqualTo(INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isEqualTo(january12_2010); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isEqualTo(february16_2012); } @Test //Tested on IntelliGID 4! public void givenPrincipalFolderWithTwoMediumTypesAndYearEndInInsufficientPeriodThenHasValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("2-2-C", PA), principal("5-5-D", MD), secondary("1-0-D", MD, PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.hasAnalogicalMedium()).isTrue(); assertThat(folder.hasElectronicMedium()).isTrue(); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2016); assertThat(folder.getDecommissioningDate()).isEqualTo(march31_2016); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("2-2-C", PA), principal("5-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("2-2-C", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2018, march31_2021); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(null, march31_2026); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2020, null); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2018); assertThat(folder.getExpectedDestructionDate()).isEqualTo(null); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2020); } @Test public void givenValidEnteredCopyRetentionRuleThenUsedForDatesCalculation() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); CopyRetentionRule principal_2_2_C = principal("2-2-C", PA); CopyRetentionRule principal_5_5_D = principal("5-5-D", MD); CopyRetentionRule secondary_1_0_D = secondary("1-0-D", MD, PA); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal_2_2_C, principal_5_5_D, secondary_1_0_D); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMainCopyRuleEntered(principal_5_5_D.getId()) .setMediumTypes(MD, PA)); assertThat(folder.hasAnalogicalMedium()).isTrue(); assertThat(folder.hasElectronicMedium()).isTrue(); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2016); assertThat(folder.getDecommissioningDate()).isEqualTo(march31_2016); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("2-2-C", PA), principal("5-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("5-5-D", MD)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2018, march31_2021); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(null, march31_2026); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2020, null); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2021); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2026); assertThat(folder.getExpectedDepositDate()).isEqualTo(null); } @Test public void givenInvalidEnteredCopyRetentionRuleThenUsedNearestCopyForDatesCalculation() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); CopyRetentionRule principal_2_2_C = principal("2-2-C", PA); CopyRetentionRule principal_5_5_D = principal("5-5-D", MD); CopyRetentionRule secondary_1_0_D = secondary("1-0-D", MD, PA); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal_2_2_C, principal_5_5_D, secondary_1_0_D); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMainCopyRuleEntered(secondary_1_0_D.getId()) .setMediumTypes(MD, PA)); assertThat(folder.hasAnalogicalMedium()).isTrue(); assertThat(folder.hasElectronicMedium()).isTrue(); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2016); assertThat(folder.getDecommissioningDate()).isEqualTo(march31_2016); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("2-2-C", PA), principal("5-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("2-2-C", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2018, march31_2021); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(null, march31_2026); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2020, null); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2018); assertThat(folder.getExpectedDestructionDate()).isEqualTo(null); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2020); } @Test public void givenCustomFolderWhenModifyTaxonomyWithCopiedMetadatasThenReindexed() throws Exception { RecordServices recordServices = getModelLayerFactory().newRecordServices(); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(Folder.SCHEMA_TYPE).createCustomSchema("customFolder"); types.getSchema(Folder.DEFAULT_SCHEMA).create("zeCalculatedMetadata").setType(STRING) .defineDataEntry().asCalculated(ZeCategoryCodeCalculator.class); } }); FolderType folderType = rm.newFolderType().setCode("ze type").setTitle("ze type").setLinkedSchema("customFolder"); recordServices.add(folderType); Folder folder = rm.newFolderWithType(folderType) .setTitle("Ze custom folder") .setOpenDate(new LocalDate()) .setAdministrativeUnitEntered(records.unitId_10a) .setCategoryEntered(records.categoryId_X13) .setRetentionRuleEntered(records.ruleId_1); recordServices.add(folder); assertThatRecord(rm.getFolder(folder.getId())) .hasMetadata(Folder.CATEGORY_CODE, "X13") .hasMetadata(Folder.ADMINISTRATIVE_UNIT_CODE, "10A") .hasMetadata("zeCalculatedMetadata", "Ze ultimate X13"); recordServices.update(rm.getCategoryWithCode("X13").setCode("X-13")); waitForBatchProcess(); assertThatRecord(rm.getFolder(folder.getId())) .hasMetadata(Folder.CATEGORY_CODE, "X-13") .hasMetadata("zeCalculatedMetadata", "Ze ultimate X-13"); } @Test //Tested on IntelliGID 4! public void givenPrincipalFolderWithTwoMediumTypesAndYearEndInSufficientPeriodThenHasValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("5-5-D", MD), principal("2-2-C", PA), secondary("1-0-D", MD, PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(january1_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(january1_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2015); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("5-5-D", MD), principal("2-2-C", PA)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("2-2-C", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2020, march31_2017); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2025, null); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(null, march31_2019); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2017); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2019); } @Test //Tested on IntelliGID 4! public void givenSemiActiveFoldersThenHasValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("888-0-D", PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(april1_2004) .setActualTransferDate(april1_2014) .setMediumTypes(PA, MD)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(april1_2004); assertThat(folder.getCloseDate()).isEqualTo(march31_2005); assertThat(folder.getActualTransferDate()).isEqualTo(april1_2014); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("888-5-T", PA), principal("888-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("888-5-T", PA)); assertThat(folder.getActiveRetentionCode()).isEqualTo("888"); assertThat(folder.getSemiActiveRetentionCode()).isNull(); assertThat(folder.getCopyRulesExpectedTransferDates()).isEqualTo(asList(new LocalDate[] { null, null })); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2020, march31_2020); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2020, null); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2020); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2020); } @Test //Tested on IntelliGID 4! public void givenActiveFoldersWithOpenPeriodsThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 0); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 0); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 0); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(PA, MD)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2016); assertThat(folder.getCopyStatus()).isEqualTo(CopyType.PRINCIPAL); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("888-5-T", PA), principal("888-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("888-5-T", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2016, march31_2016); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2021, march31_2021); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2021, null); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2016); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2021); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2021); } @Test //Tested on IntelliGID 4! public void givenActiveFoldersWithOpenPeriodsAndDecommissioningDelaysThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2026); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("888-5-T", PA), principal("888-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("888-5-T", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31_2056, march31_2056); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2061, march31_2061); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31_2061, null); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2056); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2061); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2061); } @Test //Tested on IntelliGID 4! public void givenActiveFoldersWithOpenPeriodsWithCustomNumberOfYearForCalculationThenUsedForDateCalculation() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules( principal("888-1-T", PA).setOpenActiveRetentionPeriod(100), principal("888-2-T", MD).setOpenActiveRetentionPeriod(0), principal("888-3-T", MD).setOpenActiveRetentionPeriod(null), secondary("999-0-D", PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2026); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).hasSize(3); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly(march31(2156), march31(2056), march31(2056)); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31(2157), march31(2058), march31(2059)); assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly(march31(2157), march31(2058), march31(2059)); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31(2056)); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31(2058)); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31(2058)); } @Test //Tested on IntelliGID 4! public void givenActiveSecondaryFoldersWithPeriodsAndDecommissioningDelaysThenValidCalculatedDates() throws Exception { givenDisabledAfterTestValidations(); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 30); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 20); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 10); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("3-3-T", PA), principal("888-888-D", MD), secondary("999-0-D", PA)); Folder folder = saveAndLoad(secondaryFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2035); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(secondary("999-0-D", PA)); assertThat(folder.getMainCopyRule()).isEqualTo(secondary("999-0-D", PA)); assertThat(folder.getActiveRetentionCode()).isEqualTo("999"); assertThat(folder.getSemiActiveRetentionCode()).isNull(); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly((LocalDate) null); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2075); assertThat(folder.getCopyRulesExpectedDepositDates()).isEqualTo(asList(new LocalDate[] { null })); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2075); assertThat(folder.getExpectedDepositDate()).isNull(); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); waitForBatchProcess(); reindexIfRequired(); recordServices.refresh(folder); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); } @Test //Tested on IntelliGID 4! public void givenActiveSecondaryFoldersWithOpenPeriodsAndDecommissioningDelaysThenValidCalculatedDates() throws Exception { givenDisabledAfterTestValidations(); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 30); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 20); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 10); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("3-3-T", PA), principal("888-888-D", MD), secondary("999-888-D", PA)); Folder folder = saveAndLoad(secondaryFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2035); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(secondary("999-888-D", PA)); assertThat(folder.getMainCopyRule()).isEqualTo(secondary("999-888-D", PA)); assertThat(folder.getActiveRetentionCode()).isEqualTo("999"); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2065); assertThat(folder.getExpectedDestructionDate()).isEqualTo(date(2105, 3, 31)); assertThat(folder.getExpectedDepositDate()).isNull(); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); waitForBatchProcess(); reindexIfRequired(); recordServices.refresh(folder); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2065); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); } @Test //Tested on IntelliGID 4! public void givenActiveSecondaryFoldersWithClosePeriodsAndDecommissioningDelaysThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 30); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 20); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 10); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("3-3-T", PA), principal("888-888-D", MD), secondary("10-0-D", PA)); Folder folder = saveAndLoad(secondaryFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(march31_2025); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(secondary("10-0-D", PA)); assertThat(folder.getMainCopyRule()).isEqualTo(secondary("10-0-D", PA)); assertThat(folder.getSemiActiveRetentionCode()).isNull(); assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly((LocalDate) null); assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly(march31_2035); assertThat(folder.getCopyRulesExpectedDepositDates()).isEqualTo(asList(new LocalDate[] { null })); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2035); assertThat(folder.getExpectedDepositDate()).isNull(); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); waitForBatchProcess(); recordServices.refresh(folder); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2035); assertThat(folder.getExpectedDepositDate()).isNull(); } @Test //Tested on IntelliGID 4! public void givenActiveFoldersWithOpenPeriodsAndDisabledDecommissioningCalculationThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, -1); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, -1); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setCloseDateEntered(february11_2015) .setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getOpenDate()).isEqualTo(february2_2015); assertThat(folder.getCloseDate()).isEqualTo(february11_2015); assertThat(folder.getDecommissioningDate()).isEqualTo(march31_2016); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getApplicableCopyRules()).containsExactly(principal("888-5-T", PA), principal("888-5-D", MD)); assertThat(folder.getMainCopyRule()).isEqualTo(principal("888-5-T", PA)); assertThat(folder.getCopyRulesExpectedTransferDates()).isEqualTo(asList(new LocalDate[] { null, null })); assertThat(folder.getCopyRulesExpectedDestructionDates()).isEqualTo(asList(new LocalDate[] { null, null })); assertThat(folder.getCopyRulesExpectedDepositDates()).isEqualTo(asList(new LocalDate[] { null, null })); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); } @Test public void givenFolderCreatedWithRuleWithoutPrincipalCopyTypeThenSecondaryEvenIfAdministrativeUnitIsInList() throws Exception { givenConfig(RMConfigs.COPY_RULE_PRINCIPAL_REQUIRED, false); givenRuleHasNoPrincipalCopyType(records.ruleId_1); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_1); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); getModelLayerFactory().newRecordServices().add(folder); assertThat(folder.getCopyStatus()).isEqualTo(CopyType.SECONDARY); } @Test public void givenFolderCreatedWithRuleWithoutPrincipalCopyTypeThenSecondaryEvenIfPrincipalEntered() throws Exception { givenConfig(RMConfigs.COPY_RULE_PRINCIPAL_REQUIRED, false); givenRuleHasNoPrincipalCopyType(records.ruleId_2); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); getModelLayerFactory().newRecordServices().add(folder); assertThat(folder.getCopyStatus()).isEqualTo(CopyType.SECONDARY); } @Test public void whenModifyingActualDatesThenStatusIsUpdated() throws Exception { final AtomicInteger folderStatusAddCounter = new AtomicInteger(); final AtomicInteger folderStatusUpdateCounter = new AtomicInteger(); getModelLayerFactory().getExtensions().forCollection(zeCollection).recordExtensions.add(new RecordExtension() { @Override public void recordInCreationBeforeSave(RecordInCreationBeforeSaveEvent event) { if (event.isSchemaType(Folder.SCHEMA_TYPE)) { folderStatusAddCounter.incrementAndGet(); } } @Override public void recordInModificationBeforeSave(RecordInModificationBeforeSaveEvent event) { if (event.isSchemaType(Folder.SCHEMA_TYPE)) { if (event.hasModifiedMetadata(Folder.ARCHIVISTIC_STATUS)) { folderStatusUpdateCounter.incrementAndGet(); } } } }); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setOpenDate(february2_2015); folder.setMediumTypes(MD, PA); getModelLayerFactory().newRecordServices().add(folder); assertThat(folderStatusAddCounter.get()).isEqualTo(1); assertThat(folderStatusUpdateCounter.get()).isEqualTo(0); folder.setActualTransferDate(february11_2015); getModelLayerFactory().newRecordServices().update(folder); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folderStatusUpdateCounter.get()).isEqualTo(1); folder.setActualTransferDate(null); getModelLayerFactory().newRecordServices().update(folder); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folderStatusUpdateCounter.get()).isEqualTo(2); folder.setActualTransferDate(february11_2015); folder.setActualDepositDate(february11_2015); getModelLayerFactory().newRecordServices().update(folder); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folderStatusAddCounter.get()).isEqualTo(1); assertThat(folderStatusUpdateCounter.get()).isEqualTo(3); } @Test public void givenRuleBasedOnCustomActiveMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); } }); //Scénario #1 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(2000)); folder1.setOpenDate(january1(1999)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(2010)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2001)); folder4.setOpenDate(january1(2001)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", march1(2010)); folder5.setOpenDate(march1(2000)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", march1(1990)); folder6.setOpenDate(march1(2000)); Folder folder7 = transaction.add(folderBuilder.build()); folder7.set("dateA", january1(1990)); folder7.setOpenDate(march1(2000)); folder7.setActualTransferDate(january1(1997)); Folder folder8 = transaction.add(folderBuilder.build()); folder8.set("dateA", march1(1990)); folder8.setOpenDate(march1(2000)); folder8.setActualTransferDate(january1(2010)); Folder folder9 = transaction.add(folderBuilder.build()); folder9.set("dateA", january1(1990)); folder9.setOpenDate(march1(2000)); folder9.setActualTransferDate(march1(2010)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2000)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2005)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2015)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder5.getExpectedTransferDate()).isEqualTo(march31(2016)); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2041)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder6.getExpectedTransferDate()).isEqualTo(march31(1996)); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2021)); assertThat(folder7.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder7.getExpectedTransferDate()).isNull(); assertThat(folder7.getExpectedDepositDate()).isEqualTo(march31(2022)); assertThat(folder8.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder8.getExpectedTransferDate()).isNull(); assertThat(folder8.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder9.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder9.getExpectedTransferDate()).isNull(); assertThat(folder9.getExpectedDepositDate()).isEqualTo(march31(2036)); } @Test public void givenRuleBasedOnCustomActiveMetadataIgnoringActiveThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); } }); //Scénario #1 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA").setIgnoreActivePeriod(true), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(2000)); folder1.setOpenDate(january1(1999)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(2010)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2001)); folder4.setOpenDate(january1(2001)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", march1(2010)); folder5.setOpenDate(march1(2000)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", march1(1990)); folder6.setOpenDate(march1(2000)); Folder folder7 = transaction.add(folderBuilder.build()); folder7.set("dateA", january1(1990)); folder7.setOpenDate(march1(2000)); folder7.setActualTransferDate(january1(1997)); Folder folder8 = transaction.add(folderBuilder.build()); folder8.set("dateA", march1(1990)); folder8.setOpenDate(march1(2000)); folder8.setActualTransferDate(january1(2010)); Folder folder9 = transaction.add(folderBuilder.build()); folder9.set("dateA", january1(1990)); folder9.setOpenDate(march1(2000)); folder9.setActualTransferDate(march1(2010)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2000)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2005)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2015)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder5.getExpectedTransferDate()).isEqualTo(march31(2016)); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2041)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder6.getExpectedTransferDate()).isEqualTo(march31(1996)); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2021)); assertThat(folder7.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder7.getExpectedTransferDate()).isNull(); assertThat(folder7.getExpectedDepositDate()).isEqualTo(march31(2022)); assertThat(folder8.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder8.getExpectedTransferDate()).isNull(); assertThat(folder8.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder9.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder9.getExpectedTransferDate()).isNull(); assertThat(folder9.getExpectedDepositDate()).isEqualTo(march31(2036)); } @Test public void givenRuleBasedOnSameActiveAndSemiActiveMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); } }); //Scénario #2 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata("dateA"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(2000)); folder1.setOpenDate(january1(1999)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(2010)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2001)); folder4.setOpenDate(january1(2001)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", march1(2010)); folder5.setOpenDate(january1(2000)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", january1(1990)); folder6.setOpenDate(march1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2000)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2005)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2015)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder5.getExpectedTransferDate()).isEqualTo(march31(2016)); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2041)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder6.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void givenRuleBasedOnSameActiveAndSemiActiveMetadataIgnoringActivePeriodThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); } }); //Scénario #2 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata("dateA").setIgnoreActivePeriod(true), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(2000)); folder1.setOpenDate(january1(1999)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(2010)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2001)); folder4.setOpenDate(january1(2001)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", march1(2010)); folder5.setOpenDate(january1(2000)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", january1(1990)); folder6.setOpenDate(march1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2000)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2005)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2015)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder5.getExpectedTransferDate()).isEqualTo(march31(2016)); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2041)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2002)); assertThat(folder6.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void givenRuleBasedOnDifferentActiveAndSemiActiveMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.DATE); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata("dateB"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(1990)); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(1990)); folder2.set("dateB", january1(1960)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.set("dateB", january1(2020)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(1990)); folder4.set("dateB", january1(1990)); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(1995)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2050)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void givenRuleSemiActiveDateBasedOnLastPartOfTimeRangeAndActiveDateBasedOnNumberMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); givenConfig(RMConfigs.CALCULATED_METADATAS_BASED_ON_FIRST_TIMERANGE_PART, false); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.NUMBER); //types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.NUMBER); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata(Folder.TIME_RANGE), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", 1990); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", 1990); folder2.set(Folder.TIME_RANGE, "2000-1960"); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", 1990); folder3.set(Folder.TIME_RANGE, "2000-2020"); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", 1990); folder4.set(Folder.TIME_RANGE, "1900-1990"); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(1995)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2050)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void test() throws Exception { // Folder folderA7 = rm.wrapFolder(recordServices.getDocumentById(records.folder_A07)); // assertThat(folderA7.getExpectedDepositDate()).isEqualTo(date(2007, 10, 31)); // assertThat(folderA7.getExpectedDepositDate()).isEqualTo(date(2007, 10, 31)); Folder folder = rm.newFolderWithId("zeFolder").setTitle("Bouc").setAdministrativeUnitEntered(records.unitId_10a) .setCategoryEntered(records.categoryId_Z112).setRetentionRuleEntered(records.ruleId_3) .setMediumTypes(rm.PA(), rm.DM()).setCopyStatusEntered(PRINCIPAL).setOpenDate(date(2000, 10, 4)); recordServices.update(folder); folder = rm.wrapFolder(recordServices.getDocumentById(folder.getId())); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2007, 12, 31)); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2007, 12, 31)); } @Test public void givenRuleSemiActiveDateBasedOnFirstPartTimeRangeAndActiveDateBasedOnNumberMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.NUMBER); //types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.NUMBER); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata(Folder.TIME_RANGE), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", 1990); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", 1990); folder2.set(Folder.TIME_RANGE, "2000-1960"); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", 1990); folder3.set(Folder.TIME_RANGE, "2000-2020"); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", 1990); folder4.set(Folder.TIME_RANGE, "1900-1990"); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(1995)); } @Test public void givenRuleActiveDateBasedOnFirstPartOfTimeRangeAndSemiActiveDateBasedOnNumberMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { //types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.NUMBER); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.NUMBER); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata(Folder.TIME_RANGE) .setSemiActiveDateMetadata("dateB"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set(Folder.TIME_RANGE, "0000-1990"); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set(Folder.TIME_RANGE, "1990-1990"); folder2.set("dateB", 1960); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set(Folder.TIME_RANGE, "1992-1990"); folder3.set("dateB", 2020); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set(Folder.TIME_RANGE, "1900-1990"); folder4.set("dateB", 1990); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(5)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(30)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(1995)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1997)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2050)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1905)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void givenRuleActiveDateBasedOnLastPartOfTimeRangeAndSemiActiveDateBasedOnNumberMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); givenConfig(RMConfigs.CALCULATED_METADATAS_BASED_ON_FIRST_TIMERANGE_PART, false); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { //types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.NUMBER); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.NUMBER); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata(Folder.TIME_RANGE) .setSemiActiveDateMetadata("dateB"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set(Folder.TIME_RANGE, "0000-1990"); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set(Folder.TIME_RANGE, "1990-1990"); folder2.set("dateB", 1960); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set(Folder.TIME_RANGE, "1992-1990"); folder3.set("dateB", 2020); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set(Folder.TIME_RANGE, "1900-1990"); folder4.set("dateB", 1990); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(1995)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2050)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2020)); } @Test public void givenRuleBasedOnDifferentActiveAndSemiActiveIgnoringActiveMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.DATE); } }); //Scénario #3 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setActiveDateMetadata("dateA") .setSemiActiveDateMetadata("dateB").setIgnoreActivePeriod(true), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(1990)); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.set("dateA", january1(1990)); folder2.set("dateB", january1(1960)); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(1990)); folder3.set("dateB", january1(2020)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(1990)); folder4.set("dateB", january1(1990)); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(1995)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2045)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(1995)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2015)); } @Test public void givenRuleBasedOnSemiActiveMetadataThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.DATE); } }); //Scénario #4 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setSemiActiveDateMetadata("dateA"), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(1990)); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(2000)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2010)); folder4.setOpenDate(january1(2000)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", january1(2010)); folder5.setOpenDate(january1(2000)); folder5.setActualTransferDate(january1(2030)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", january1(2010)); folder6.setOpenDate(january1(2000)); folder6.setActualTransferDate(january1(2060)); Folder folder7 = transaction.add(folderBuilder.build()); folder7.set("dateA", january1(2005)); folder7.setOpenDate(january1(2000)); folder7.setActualTransferDate(january1(2030)); Folder folder8 = transaction.add(folderBuilder.build()); folder8.set("dateA", march1(2004)); folder8.setOpenDate(january1(2000)); folder8.setActualTransferDate(january1(2030)); Folder folder9 = transaction.add(folderBuilder.build()); folder9.set("dateA", january1(2010)); folder9.setOpenDate(january1(2000)); folder9.setActualTransferDate(january1(2060)); folder9.setActualDepositDate(january1(2065)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2020)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder5.getExpectedTransferDate()).isNull(); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2040)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder6.getExpectedTransferDate()).isNull(); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2060)); assertThat(folder7.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder7.getExpectedTransferDate()).isNull(); assertThat(folder7.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder8.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder8.getExpectedTransferDate()).isNull(); assertThat(folder8.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder9.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder9.getExpectedTransferDate()).isNull(); assertThat(folder9.getExpectedDepositDate()).isNull(); } @Test public void givenRuleBasedOnSemiActiveMetadataIgnoringActiveThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateA").setType(MetadataValueType.DATE); types.getSchema(Folder.DEFAULT_SCHEMA).create("dateB").setType(MetadataValueType.DATE); } }); //Scénario #4 : Délai “5-25-C”. Actif basée sur année financière, semi-actif laissé vide RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "5-25-C").setSemiActiveDateMetadata("dateA") .setIgnoreActivePeriod(true), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setMediumTypes(MD, PA); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.set("dateA", january1(1990)); folder1.setOpenDate(january1(2000)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.setOpenDate(january1(2000)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.set("dateA", january1(2000)); folder3.setOpenDate(january1(2000)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.set("dateA", january1(2010)); folder4.setOpenDate(january1(2000)); Folder folder5 = transaction.add(folderBuilder.build()); folder5.set("dateA", january1(2010)); folder5.setOpenDate(january1(2000)); folder5.setActualTransferDate(january1(2030)); Folder folder6 = transaction.add(folderBuilder.build()); folder6.set("dateA", january1(2010)); folder6.setOpenDate(january1(2000)); folder6.setActualTransferDate(january1(2065)); Folder folder7 = transaction.add(folderBuilder.build()); folder7.set("dateA", january1(2005)); folder7.setOpenDate(january1(2000)); folder7.setActualTransferDate(january1(2030)); Folder folder8 = transaction.add(folderBuilder.build()); folder8.set("dateA", january1(2004)); folder8.setOpenDate(january1(2000)); folder8.setActualTransferDate(january1(2030)); Folder folder9 = transaction.add(folderBuilder.build()); folder9.set("dateA", january1(2010)); folder9.setOpenDate(january1(2000)); folder9.setActualTransferDate(january1(2060)); folder9.setActualDepositDate(january1(2065)); recordServices.execute(transaction); assertThat(folder1.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder1.getExpectedDepositDate()).isEqualTo(march31(2015)); assertThat(folder2.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder2.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder2.getExpectedDepositDate()).isEqualTo(march31(2031)); assertThat(folder3.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder3.getExpectedDepositDate()).isEqualTo(march31(2025)); assertThat(folder4.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder4.getExpectedTransferDate()).isEqualTo(march31(2006)); assertThat(folder4.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder5.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder5.getExpectedTransferDate()).isNull(); assertThat(folder5.getExpectedDepositDate()).isEqualTo(march31(2035)); assertThat(folder6.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder6.getExpectedTransferDate()).isNull(); assertThat(folder6.getExpectedDepositDate()).isEqualTo(march31(2065)); assertThat(folder7.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder7.getExpectedTransferDate()).isNull(); assertThat(folder7.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder8.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder8.getExpectedTransferDate()).isNull(); assertThat(folder8.getExpectedDepositDate()).isEqualTo(march31(2030)); assertThat(folder9.getCloseDate()).isEqualTo(march31(2001)); assertThat(folder9.getExpectedTransferDate()).isNull(); assertThat(folder9.getExpectedDepositDate()).isNull(); } @Test public void givenConcreteUseCaseThenValidCalculatedDates() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, false); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("dateNaiss").setType(MetadataValueType.DATE); } }); RetentionRule rule2 = rm.getRetentionRule(records.ruleId_2); rule2.setCopyRetentionRules(asList( copyBuilder.newPrincipal(asList(records.PA), "888-75-D").setSemiActiveDateMetadata("dateNaiss") .setIgnoreActivePeriod(true), copyBuilder.newPrincipal(asList(records.MD), "75-0-D").setActiveDateMetadata("dateNaiss") .setIgnoreActivePeriod(true), copyBuilder.newSecondary(asList(records.MD), "42-42-D") )); recordServices.update(rule2); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); return folder; } }; Folder folder1 = transaction.add(folderBuilder.build()); folder1.setMediumTypes(records.PA); folder1.set("dateNaiss", january1(1986)); folder1.setOpenDate(january1(1991)); folder1.setCloseDateEntered(january1(1997)); Folder folder2 = transaction.add(folderBuilder.build()); folder2.setMediumTypes(records.MD); folder2.setOpenDate(january1(1991)); folder2.setCloseDateEntered(january1(1997)); Folder folder3 = transaction.add(folderBuilder.build()); folder3.setMediumTypes(records.PA); folder3.set("dateNaiss", january1(1986)); folder3.setOpenDate(january1(2000)); folder3.setCloseDateEntered(january1(2001)); Folder folder4 = transaction.add(folderBuilder.build()); folder4.setMediumTypes(records.PA); folder4.set("dateNaiss", january1(1986)); folder4.setOpenDate(january1(2000)); recordServices.execute(transaction); // assertThat(folder1.getExpectedTransferDate()).isEqualTo(march31(1998)); assertThat(folder1.getExpectedDestructionDate()).isEqualTo(march31(1986 + 75)); assertThat(folder2.getExpectedTransferDate()).isNull(); assertThat(folder2.getExpectedDestructionDate()).isEqualTo(march31(1997 + 75)); assertThat(folder3.getExpectedTransferDate()).isEqualTo(march31(2002)); assertThat(folder3.getExpectedDestructionDate()).isEqualTo(march31(1986 + 75)); assertThat(folder4.getExpectedTransferDate()).isNull(); assertThat(folder4.getExpectedDestructionDate()).isNull(); } @Test public void givenMultipleRuleWithRetentionCopiesThenFolderOnlyCopiesOfSameTypeAreApplicable() throws Exception { givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, false); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 1); RetentionRule rule2 = transaction.add(rm.getRetentionRule(records.ruleId_2)); FolderType type1 = transaction.add(rm.newFolderType().setCode("type1").setTitle("Type 1")); FolderType type2 = transaction.add(rm.newFolderType().setCode("type2").setTitle("Type 2")); FolderType type3 = transaction.add(rm.newFolderType().setCode("type3").setTitle("Type 3")); CopyRetentionRule copy1 = copyBuilder.newPrincipal(asList(records.PA), "1-0-D").setTypeId(type1); CopyRetentionRule copy2 = copyBuilder.newPrincipal(asList(records.MD), "2-0-D").setTypeId(type1); CopyRetentionRule copy3 = copyBuilder.newPrincipal(records.PA_MD, "3-0-D").setTypeId(type1); CopyRetentionRule copy4 = copyBuilder.newPrincipal(asList(records.PA), "4-0-D").setTypeId(type2); CopyRetentionRule copy5 = copyBuilder.newPrincipal(asList(records.MD), "5-0-D").setTypeId(type2); CopyRetentionRule copy6 = copyBuilder.newPrincipal(records.PA_MD, "6-0-D").setTypeId(type2); CopyRetentionRule copy7 = copyBuilder.newPrincipal(asList(records.PA), "7-0-D"); CopyRetentionRule copy8 = copyBuilder.newPrincipal(asList(records.MD), "8-0-D"); CopyRetentionRule copy9 = copyBuilder.newPrincipal(records.PA_MD, "9-0-D"); CopyRetentionRule copy10 = copyBuilder.newSecondary(asList(records.MD), "10-0-D"); rule2.setCopyRetentionRules(asList(copy1, copy2, copy3, copy4, copy5, copy6, copy7, copy8, copy9, copy10)); recordServices.execute(transaction); transaction = new Transaction(); Builder<Folder> folderBuilder = new Builder<Folder>() { @Override public Folder build() { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_2); folder.setCopyStatusEntered(CopyType.PRINCIPAL); folder.setOpenDate(january1(1991)); return folder; } }; Folder folderType1 = transaction.add(folderBuilder.build()).setType(type1); Folder folderType1_PA = transaction.add(folderBuilder.build()).setType(type1).setMediumTypes(records.PA); Folder folderType1_MD = transaction.add(folderBuilder.build()).setType(type1).setMediumTypes(records.MD); Folder folderType1_PA_MD = transaction.add(folderBuilder.build()).setType(type1).setMediumTypes(records.PA_MD); Folder folderType2 = transaction.add(folderBuilder.build()).setType(type2); Folder folderType2_PA = transaction.add(folderBuilder.build()).setType(type2).setMediumTypes(records.PA); Folder folderType2_MD = transaction.add(folderBuilder.build()).setType(type2).setMediumTypes(records.MD); Folder folderType2_PA_MD = transaction.add(folderBuilder.build()).setType(type2).setMediumTypes(records.PA_MD); Folder folderType3 = transaction.add(folderBuilder.build()).setType(type3); Folder folderType3_PA = transaction.add(folderBuilder.build()).setType(type3).setMediumTypes(records.PA); Folder folderType3_MD = transaction.add(folderBuilder.build()).setType(type3).setMediumTypes(records.MD); Folder folderType3_PA_MD = transaction.add(folderBuilder.build()).setType(type3).setMediumTypes(records.PA_MD); Folder folderWithoutType = transaction.add(folderBuilder.build()); Folder folderWithoutType_PA = transaction.add(folderBuilder.build()).setMediumTypes(records.PA); Folder folderWithoutType_MD = transaction.add(folderBuilder.build()).setMediumTypes(records.MD); Folder folderWithoutType_PA_MD = transaction.add(folderBuilder.build()).setMediumTypes(records.PA_MD); Folder secondaryFolderType1 = transaction.add(folderBuilder.build()).setType(type1).setMediumTypes(records.PA_MD) .setCopyStatusEntered(CopyType.SECONDARY); Folder secondaryFolderType2 = transaction.add(folderBuilder.build()).setType(type2).setMediumTypes(records.PA_MD) .setCopyStatusEntered(CopyType.SECONDARY); Folder secondaryFolder = transaction.add(folderBuilder.build()).setType(type1).setMediumTypes(records.PA_MD) .setCopyStatusEntered(CopyType.SECONDARY); recordServices.execute(transaction); assertThat(folderType1.getApplicableCopyRules()).containsOnly(copy1, copy2, copy3); assertThat(folderType1_PA.getApplicableCopyRules()).containsOnly(copy1, copy3); assertThat(folderType1_MD.getApplicableCopyRules()).containsOnly(copy2, copy3); assertThat(folderType1_PA_MD.getApplicableCopyRules()).containsOnly(copy1, copy2, copy3); assertThat(folderType2.getApplicableCopyRules()).containsOnly(copy4, copy5, copy6); assertThat(folderType2_PA.getApplicableCopyRules()).containsOnly(copy4, copy6); assertThat(folderType2_MD.getApplicableCopyRules()).containsOnly(copy5, copy6); assertThat(folderType2_PA_MD.getApplicableCopyRules()).containsOnly(copy4, copy5, copy6); assertThat(folderType3.getApplicableCopyRules()).containsOnly(copy7, copy8, copy9); assertThat(folderType3_PA.getApplicableCopyRules()).containsOnly(copy7, copy9); assertThat(folderType3_MD.getApplicableCopyRules()).containsOnly(copy8, copy9); assertThat(folderType3_PA_MD.getApplicableCopyRules()).containsOnly(copy7, copy8, copy9); assertThat(folderWithoutType.getApplicableCopyRules()).containsOnly(copy7, copy8, copy9); assertThat(folderWithoutType_PA.getApplicableCopyRules()).containsOnly(copy7, copy9); assertThat(folderWithoutType_MD.getApplicableCopyRules()).containsOnly(copy8, copy9); assertThat(folderWithoutType_PA_MD.getApplicableCopyRules()).containsOnly(copy7, copy8, copy9); assertThat(secondaryFolderType1.getApplicableCopyRules()).containsOnly(copy10); assertThat(secondaryFolderType2.getApplicableCopyRules()).containsOnly(copy10); assertThat(secondaryFolder.getApplicableCopyRules()).containsOnly(copy10); } @Test public void givenDisabledManualArchivisticMetadataWhenFolderSavedThenManualMetadataNotConsidered() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.DISABLED); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED) .setManualExpectedTransferDate(january12_2010) .setManualExpectedDepositDate(february16_2012) .setManualExpectedDestructionDate(january1_2015) ); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2056); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2061); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2061); } @Test public void givenEnabledManualArchivisticMetadataWhenFolderSavedThenManualMetadataConsidered() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED) .setManualExpectedTransferDate(january12_2010) .setManualExpectedDepositDate(february16_2012) .setManualExpectedDestructionDate(january1_2015) ); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getExpectedTransferDate()).isEqualTo(january12_2010); assertThat(folder.getExpectedDepositDate()).isEqualTo(february16_2012); assertThat(folder.getExpectedDestructionDate()).isEqualTo(january1_2015); } @Test public void givenCompleteEnabledAndManualArchivisticMetadatasEnabledWhenSavingSemiActiveOrInactiveFolderWithoutTransferDateThenCalculateRealTransferDate() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.COMPLETE_DECOMMISSIONNING_DATE_WHEN_CREATING_FOLDER_WITH_MANUAL_STATUS, CompleteDatesWhenAddingFolderWithManualStatusChoice.ENABLED); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getExpectedTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isEqualTo(date(2061, 3, 31)); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folder.getActualTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isEqualTo(date(2061, 3, 31)); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DESTROYED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE) .setActualTransferDate(date(2055, 3, 31))); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folder.getActualTransferDate()).isEqualTo(date(2055, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2060, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isEqualTo(date(2060, 3, 31)); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA).setActualTransferDate(date(2055, 3, 31)) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2055, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isEqualTo(date(2060, 3, 31)); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA).setActualTransferDate(date(2055, 3, 31)) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED) .setActualDepositDate(date(2061, 3, 31))); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2055, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DESTROYED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DESTROYED) .setActualTransferDate(date(2055, 3, 31))); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2055, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isEqualTo(date(2060, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DESTROYED) .setActualTransferDate(date(2055, 3, 31)) .setActualDestructionDate(date(2061, 3, 31))); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isEqualTo(date(2055, 3, 31)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); } @Test public void givenCompleteDisabledAndManualArchivisticMetadatasEnabledWhenSavingSemiActiveOrInactiveFolderWithoutTransferDateThenCalculateRealTransferDate() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenConfig(RMConfigs.COMPLETE_DECOMMISSIONNING_DATE_WHEN_CREATING_FOLDER_WITH_MANUAL_STATUS, CompleteDatesWhenAddingFolderWithManualStatusChoice.DISABLED); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getExpectedTransferDate()).isEqualTo(date(2056, 3, 31)); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2061, 3, 31)); assertThat(folder.getExpectedDestructionDate()).isEqualTo(date(2061, 3, 31)); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getExpectedTransferDate()).isNull(); //BAD values assertThat(folder.getExpectedDepositDate()).isNotNull(); assertThat(folder.getExpectedDestructionDate()).isNotNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DEPOSITED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMediumTypes(MD, PA) .setManualArchivisticStatus(FolderStatus.INACTIVE_DESTROYED)); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); assertThat(folder.getActualTransferDate()).isNull(); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getActualDepositDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isNull(); assertThat(folder.getActualDestructionDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); } @Test public void givenEnabledManualArchivisticMetadataAndNullManualMetadataWhenFolderSavedThenManualMetadataNotConsidered() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_RULE, 10); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE_NUMBER_OF_YEAR_WHEN_FIXED_RULE, 20); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 30); givenConfig(RMConfigs.CALCULATED_INACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 40); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal("888-5-T", PA), principal("888-5-D", MD), secondary("999-0-D", PA)); givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES, AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015) .setMediumTypes(MD, PA) .setManualArchivisticStatus(null) .setManualExpectedTransferDate(null) .setManualExpectedDepositDate(null) .setManualExpectedDestructionDate(null) ); assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.ACTIVE); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2056); assertThat(folder.getExpectedDestructionDate()).isEqualTo(march31_2061); assertThat(folder.getExpectedDepositDate()).isEqualTo(march31_2061); } @Test public void givenRetentionRuleIsReferencingALogicallyDeletedAdministrativeUnitWhenCreatingAFolderWithThisRuleThenException() throws Exception { Transaction transaction = new Transaction(); String id = transaction.add(rm.newAdministrativeUnit().setCode("zeUnit").setTitle("zeTitle")).getId(); RetentionRule rule = records.getRule1(); List<String> administrativeUnits = new ArrayList<>(rule.getAdministrativeUnits()); administrativeUnits.add(id); rule.setAdministrativeUnits(administrativeUnits); transaction.add(rule); recordServices.execute(transaction); AdministrativeUnit unit = rm.getAdministrativeUnit(id); unit.getWrappedRecord().set(Schemas.LOGICALLY_DELETED_STATUS, true); recordServices.update(unit); Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setRetentionRuleEntered(records.ruleId_1); folder.setTitle("Ze title"); folder.setOpenDate(new LocalDate()); recordServices.add(folder); System.out.println(folder.getCategory()); } @Test public void givenRetentionRuleWithoutSemiActivePeriodWhenCreatingAFolderWithThisRuleThenExpectedTransferDateIsNull() throws Exception { Folder folder = saveAndLoad(folderWithSingleCopyRule(principal("888-0-D", PA)) .setOpenDate(november4_2009) .setCloseDateEntered(december12_2009)); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNotNull(); } @Test public void givenFolderHasAConfidentialRuleThenIsConfidential() throws Exception { Transaction tx = new Transaction(); tx.add(records.getRule1().setConfidentialDocuments(true)); Folder folder1 = tx.add(newFolderWithIdAndDefaultValues("folder1").setRetentionRuleEntered(records.ruleId_1)); Folder folder2 = tx.add(newFolderWithIdAndDefaultValues("folder2").setRetentionRuleEntered(records.ruleId_2)); Document document1 = tx.add(rm.newDocument().setFolder(folder1).setTitle("Doc 1")); Document document2 = tx.add(rm.newDocument().setFolder(folder2).setTitle("Doc 1")); recordServices.execute(tx); assertThat(folder1.isConfidential()).isTrue(); assertThat(folder2.isConfidential()).isFalse(); assertThat(folder1.isEssential()).isFalse(); assertThat(folder2.isEssential()).isFalse(); assertThat(document1.isConfidential()).isTrue(); assertThat(document2.isConfidential()).isFalse(); assertThat(document1.isEssential()).isFalse(); assertThat(document2.isEssential()).isFalse(); } @Test public void givenFolderHasAnEssentialRuleThenIsEssential() throws Exception { Transaction tx = new Transaction(); tx.add(records.getRule1().setEssentialDocuments(true)); Folder folder1 = tx.add(newFolderWithIdAndDefaultValues("folder1").setRetentionRuleEntered(records.ruleId_1)); Folder folder2 = tx.add(newFolderWithIdAndDefaultValues("folder2").setRetentionRuleEntered(records.ruleId_2)); Document document1 = tx.add(rm.newDocument().setFolder(folder1).setTitle("Doc 1")); Document document2 = tx.add(rm.newDocument().setFolder(folder2).setTitle("Doc 1")); recordServices.execute(tx); assertThat(folder1.isConfidential()).isFalse(); assertThat(folder2.isConfidential()).isFalse(); assertThat(folder1.isEssential()).isTrue(); assertThat(folder2.isEssential()).isFalse(); assertThat(document1.isConfidential()).isFalse(); assertThat(document2.isConfidential()).isFalse(); assertThat(document1.isEssential()).isTrue(); assertThat(document2.isEssential()).isFalse(); } @Test //Tested on IntelliGID 4! public void givenRetentionRuleWithTwoCopyRulesAndFolderWithManuallyEnteredCopyRuleThenOnlyTakeThatCopyRule() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90); CopyRetentionRule principal22C = principal("2-2-C", PA); CopyRetentionRule principal55D = principal("5-5-D", PA); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal22C, principal55D, secondary("1-0-D", MD, PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(february2_2015).setMainCopyRuleEntered(principal55D.getId())); assertThat(folder.getCloseDate()).isEqualTo(march31_2021); } @Test public void givenFolderHasBeenReactivatedWithoutACustomCalculationDateThenTranferedAgainThenFirstReactivationUsedForCalculation() throws Exception { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_1); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); folder.setActualTransferDate(date(2018, 2, 11)); folder.addReactivation(users.gandalfIn(zeCollection), date(2017, 2, 11)); getModelLayerFactory().newRecordServices().add(folder); //42-5-C //assertThat(folder.getMainCopyRule().toString()).isEqualTo("todo"); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2023, 12, 31)); } @Test public void givenFolderHasBeenReactivatedWithACustomCalculationDateThenTranferedAgainThenCustomDateUsedForCalculation() throws Exception { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_1); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); folder.setActualTransferDate(date(2018, 2, 11)); folder.addReactivation(users.gandalfIn(zeCollection), date(2017, 2, 11)); getModelLayerFactory().newRecordServices().add(folder); assertThat(folder.getExpectedTransferDate()).isNull(); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2023, 12, 31)); } @Test public void givenFolderHasBeenReactivatedWithoutACustomCalculationDateThenFirstReactivationUsedForCalculation() throws Exception { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_1); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); folder.addReactivation(users.gandalfIn(zeCollection), date(2017, 2, 11)); getModelLayerFactory().newRecordServices().add(folder); assertThat(folder.getExpectedTransferDate()).isEqualTo(date(2018, 12, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2023, 12, 31)); } @Test public void givenFolderHasBeenReactivatedWithACustomCalculationDateThenCustomDateUsedForCalculation() throws Exception { Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(records.ruleId_1); folder.setOpenDate(february2_2015); folder.setCloseDateEntered(february11_2015); folder.setMediumTypes(MD, PA); folder.addReactivation(users.gandalfIn(zeCollection), date(2017, 2, 11)); getModelLayerFactory().newRecordServices().add(folder); assertThat(folder.getExpectedTransferDate()).isEqualTo(date(2018, 12, 31)); assertThat(folder.getExpectedDestructionDate()).isNull(); assertThat(folder.getExpectedDepositDate()).isEqualTo(date(2023, 12, 31)); } @Test public void givenUncalculatedOpenSemiActiveDateWhenFolderHasARuleWithAdditionnalOpenActivePeriodThenOnlyThisPeriodIsUsed() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, -1); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); CopyRetentionRule principal888p3_2_C = principal("888-2-C", PA).setOpenActiveRetentionPeriod(3); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal888p3_2_C, secondary("1-0-D", MD, PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(date(2012, 1, 1)) .setCloseDateEntered(date(2013, 1, 1)) .setMainCopyRuleEntered(principal888p3_2_C.getId())); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2016); } @Test public void givenCalculatedOpenSemiActiveDateWhenFolderHasARuleWithAdditionnalOpenActivePeriodThenBothPeriodsAreUsed() throws Exception { givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE); givenConfig(RMConfigs.YEAR_END_DATE, "03/31"); givenConfig(RMConfigs.CALCULATED_SEMIACTIVE_DATE_NUMBER_OF_YEAR_WHEN_VARIABLE_PERIOD, 1); givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 60); CopyRetentionRule principal888p3_2_C = principal("888-2-C", PA).setOpenActiveRetentionPeriod(3); givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(principal888p3_2_C, secondary("1-0-D", MD, PA)); Folder folder = saveAndLoad(principalFolderWithZeRule() .setOpenDate(date(2012, 1, 1)) .setCloseDateEntered(date(2013, 1, 1)) .setMainCopyRuleEntered(principal888p3_2_C.getId())); assertThat(folder.getExpectedTransferDate()).isEqualTo(march31_2017); } // ------------------------------------------------------------------------- private LocalDate march1(int year) { return new LocalDate(year, 3, 1); } private LocalDate january1(int year) { return new LocalDate(year, 1, 1); } private void givenRuleHasNoPrincipalCopyType(String id) throws Exception { RetentionRule rule = rm.getRetentionRule(id); List<CopyRetentionRule> copyRules = new ArrayList<>(rule.getCopyRetentionRules()); for (Iterator<CopyRetentionRule> iterator = copyRules.iterator(); iterator.hasNext(); ) { if (iterator.next().getCopyType() == CopyType.PRINCIPAL) { iterator.remove(); } } rule.setCopyRetentionRules(copyRules); try { getModelLayerFactory().newRecordServices().update(rule); } catch (RecordServicesException e) { throw new RuntimeException(e); } } private Folder folderWithSingleCopyRule(CopyRetentionRule copyRetentionRule) { givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(copyRetentionRule, secondary("888-888-D", PA)); if (!transaction.getRecords().isEmpty()) { try { recordServices.execute(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } transaction = new Transaction(); } Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(aPrincipalAdminUnit); folder.setCategoryEntered(records.categoryId_X110); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(zeRule); folder.setCopyStatusEntered(copyRetentionRule.getCopyType()); return folder; } private Folder principalFolderWithZeRule() { if (!transaction.getRecords().isEmpty()) { try { recordServices.execute(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } transaction = new Transaction(); } Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(aPrincipalAdminUnit); folder.setCategoryEntered(records.categoryId_X110); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(zeRule); folder.setCopyStatusEntered(CopyType.PRINCIPAL); return folder; } private Folder secondaryFolderWithZeRule() { if (!transaction.getRecords().isEmpty()) { try { recordServices.execute(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } transaction = new Transaction(); } Folder folder = rm.newFolder(); folder.setAdministrativeUnitEntered(aPrincipalAdminUnit); folder.setCategoryEntered(records.categoryId_X110); folder.setTitle("Ze folder"); folder.setRetentionRuleEntered(zeRule); folder.setCopyStatusEntered(CopyType.SECONDARY); return folder; } private Folder saveAndLoad(Folder folder) throws RecordServicesException { recordServices.add(folder.getWrappedRecord()); return rm.getFolder(folder.getId()); } private RetentionRule givenRuleWithResponsibleAdminUnitsFlagAndCopyRules(CopyRetentionRule... rules) { return givenRetentionRule(rules).setResponsibleAdministrativeUnits(true); } private RetentionRule givenRuleWithAdminUnitsAndCopyRules(CopyRetentionRule... rules) { return givenRetentionRule(rules).setAdministrativeUnits(Arrays.asList(aPrincipalAdminUnit, anotherPrincipalAdminUnit)); } private RetentionRule givenRetentionRule(CopyRetentionRule... rules) { RetentionRule retentionRule = rm.newRetentionRuleWithId(zeRule); retentionRule.setCode("Ze rule"); retentionRule.setTitle("Ze rule"); retentionRule.setApproved(true); // retentionRule.setChildrenNodes(asList(zeCategory)); retentionRule.setCopyRetentionRules(rules); return transaction.add(retentionRule); } private CopyRetentionRule principal(String status, String... mediumTypes) { return copyBuilder.newPrincipal(asList(mediumTypes), status); } private CopyRetentionRule secondary(String status, String... mediumTypes) { return copyBuilder.newSecondary(asList(mediumTypes), status); } private Folder newFolderWithIdAndDefaultValues(String id) { Folder folder = rm.newFolderWithId(id); folder.setAdministrativeUnitEntered(records.unitId_10a); folder.setCategoryEntered(records.categoryId_X13); folder.setRetentionRuleEntered(records.ruleId_1); folder.setTitle("Folder " + id); folder.setOpenDate(new LocalDate()); folder.setCopyStatusEntered(CopyType.PRINCIPAL); return folder; } private LocalDate march31(int year) { return new LocalDate(year, 3, 31); } public static class ZeCategoryCodeCalculator implements MetadataValueCalculator<String> { ReferenceDependency<String> codeParam = ReferenceDependency.toAString(Folder.CATEGORY, Category.CODE); @Override public String calculate(CalculatorParameters parameters) { String code = parameters.get(codeParam); return "Ze ultimate " + code; } @Override public String getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return STRING; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return TestUtils.asList(codeParam); } } }