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.DecommissioningDateBasedOn.OPEN_DATE;
import static com.constellio.app.modules.rm.model.enums.FolderStatus.ACTIVE;
import static com.constellio.app.modules.rm.model.enums.RetentionType.FIXED;
import static com.constellio.app.modules.rm.model.enums.RetentionType.OPEN;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import org.joda.time.LocalDate;
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.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.Folder;
import com.constellio.app.modules.rm.wrappers.RetentionRule;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.sdk.tests.ConstellioTest;
public class FolderDecommissioningDateAcceptanceTest extends ConstellioTest {
CopyRetentionRuleBuilder copyBuilder = CopyRetentionRuleBuilder.UUID();
LocalDate november4_2009 = new LocalDate(2009, 11, 4);
LocalDate november4_2010 = new LocalDate(2010, 11, 4);
LocalDate november4_2011 = new LocalDate(2011, 11, 4);
LocalDate november4_2012 = new LocalDate(2012, 11, 4);
LocalDate november4_2013 = new LocalDate(2013, 11, 4);
LocalDate november4_2014 = new LocalDate(2014, 11, 4);
LocalDate november4_2015 = new LocalDate(2015, 11, 4);
LocalDate november4_2016 = new LocalDate(2016, 11, 4);
LocalDate december31_2010 = new LocalDate(2010, 12, 31);
LocalDate december31_2012 = new LocalDate(2012, 12, 31);
LocalDate december31_2013 = new LocalDate(2013, 12, 31);
LocalDate december31_2014 = new LocalDate(2014, 12, 31);
LocalDate december31_2015 = new LocalDate(2015, 12, 31);
LocalDate december31_2016 = new LocalDate(2016, 12, 31);
LocalDate december12_2009 = new LocalDate(2009, 12, 12);
LocalDate january12_2010 = new LocalDate(2010, 1, 12);
LocalDate january12_2012 = new LocalDate(2012, 1, 12);
LocalDate january12_2014 = new LocalDate(2014, 1, 12);
LocalDate february15_2015 = new LocalDate(2015, 2, 15);
LocalDate february16_2015 = new LocalDate(2015, 2, 16);
LocalDate february17_2015 = new LocalDate(2015, 2, 17);
LocalDate february15_2017 = new LocalDate(2017, 2, 15);
LocalDate february16_2017 = new LocalDate(2017, 2, 16);
LocalDate february17_2017 = new LocalDate(2017, 2, 17);
RMSchemasRecordsServices rm;
RMTestRecords records = new RMTestRecords(zeCollection);
RecordServices recordServices;
Transaction transaction = new Transaction();
String zeCategory;
String aPrincipalAdminUnit;
String anotherPrincipalAdminUnit;
String aSecondaryAdminUnit;
String PA;
String MV;
String MD;
CopyType noEnteredCopyType = null;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withRMTest(records)
);
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 givenCloseDateNotCaculatedThenEnteredCloseDateIsChoosed()
throws Exception {
givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, false);
givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE);
Folder folderWithCloseDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009)
.setCloseDateEntered(january12_2012));
assertThat(folderWithCloseDate.getCloseDate()).isEqualTo(january12_2012);
Folder folderWithoutCloseDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009));
assertThat(folderWithoutCloseDate.getCloseDate()).isNull();
}
@Test
public void givenDecommissioningDateBasedOnOpenDateThenOpenDateChoosed()
throws Exception {
givenConfig(RMConfigs.YEAR_END_DATE, "12/31");
givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 90);
givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, OPEN_DATE);
// Folder folderWithoutOpenDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA)));
// assertThat(folderWithoutOpenDate.getDecommissioningDate()).isNull();
// assertThat(folderWithoutOpenDate.getOpenDate()).isNull();
// assertThat(folderWithoutOpenDate.getCloseDate()).isNull();
// assertThat(folderWithoutOpenDate.getCloseDateEntered()).isNull();
Folder folderWithOpenDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009));
assertThat(folderWithOpenDate.getOpenDate()).isEqualTo(november4_2009);
assertThat(folderWithOpenDate.getCloseDate()).isEqualTo(december31_2015);
assertThat(folderWithOpenDate.getCloseDateEntered()).isNull();
assertThat(folderWithOpenDate.getDecommissioningDate()).isEqualTo(december31_2010);
}
@Test
public void givenDecommissioningDateBasedOnCloseDateThenCloseDateChoosed()
throws Exception {
givenConfig(RMConfigs.YEAR_END_DATE, "12/31");
givenConfig(RMConfigs.REQUIRED_DAYS_BEFORE_YEAR_END_FOR_NOT_ADDING_A_YEAR, 30);
givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE);
// Folder folderWithoutOpenDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA)));
// assertThat(folderWithoutOpenDate.getDecommissioningDate()).isNull();
// assertThat(folderWithoutOpenDate.getOpenDate()).isNull();
// assertThat(folderWithoutOpenDate.getCloseDate()).isNull();
// assertThat(folderWithoutOpenDate.getCloseDateEntered()).isNull();
Folder folderWithOpenDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009));
assertThat(folderWithOpenDate.getOpenDate()).isEqualTo(november4_2009);
assertThat(folderWithOpenDate.getCloseDate()).isEqualTo(december31_2014);
assertThat(folderWithOpenDate.getCloseDateEntered()).isNull();
assertThat(folderWithOpenDate.getDecommissioningDate()).isEqualTo(december31_2014);
}
@Test
public void givenDecommissioningDateBasedOnCloseDateAndEnteredCloseDateThenEnteredCloseDateChoosed()
throws Exception {
givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE);
Folder folderWithEnteredCloseDate = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009)
.setCloseDateEntered(january12_2012));
assertThat(folderWithEnteredCloseDate.getOpenDate()).isEqualTo(november4_2009);
assertThat(folderWithEnteredCloseDate.getCloseDate()).isEqualTo(january12_2012);
assertThat(folderWithEnteredCloseDate.getCloseDateEntered()).isEqualTo(january12_2012);
assertThat(folderWithEnteredCloseDate.getDecommissioningDate()).isEqualTo(december31_2012);
}
@Test
public void givenFolderInSemiActivePhaseWithRealTransferDateThenChoosedAsDecommissioningDate()
throws Exception {
givenTimeIs(february17_2015);
Folder folder = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009)
.setCloseDateEntered(january12_2012)
.setActualTransferDate(february16_2015));
assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE);
assertThat(folder.getDecommissioningDate()).isEqualTo(december31_2015);
assertThat(folder.getCopyRulesExpectedTransferDates()).isEqualTo(asList(new LocalDate[] { null }));
}
@Test
public void givenFolderInInactivePhaseWithRealTransferDateThenCloseDateChoosedAsDecommissioningDate()
throws Exception {
givenTimeIs(february17_2017);
Folder folder = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009)
.setCloseDateEntered(january12_2012)
.setActualTransferDate(february16_2015)
.setActualDepositDate(february16_2017));
assertThat(folder.getArchivisticStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED);
assertThat(folder.getDecommissioningDate()).isEqualTo(december31_2012);
assertThat(folder.getCopyRulesExpectedTransferDates()).isEqualTo(asList(new LocalDate[] { null }));
assertThat(folder.getCopyRulesExpectedDepositDates()).isEqualTo(asList(new LocalDate[] { null }));
}
// @Test
// public void givenFolderWithFixedCopyRuleThenChoosedAsPlanifiedTransferDate()
// throws Exception {
//
// Folder folder = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
// .setOpenDate(november4_2009)
// .setCloseDateEntered(january12_2012)
// .setActualTransferDate(february16_2015));
//
// assertThat(folder.getDecommissioningDate()).isEqualTo(january12_2012);
// assertThat(folder.getPlanifiedTransferDate()).isEqualTo(february16_2015);
//
// }
//@Test
public void givenActiveFolderInSameUnitThanItsRuleWith()
throws Exception {
givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true);
givenConfig(RMConfigs.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE);
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.DECOMMISSIONING_DATE_BASED_ON, CLOSE_DATE);
givenRuleWithAdminUnitsAndCopyRules(principal("2-888-D", PA), secondary("1-0-D"));
Folder folder = saveAndLoad(folderWithCopyRule(principal("5-0-D", PA))
.setOpenDate(november4_2009));
assertThat(folder.getCopyStatus()).isEqualTo(PRINCIPAL);
assertThat(folder.getApplicableCopyRules()).containsOnlyOnce(principal("2-888-D", PA));
assertThat(folder.getMainCopyRule()).isEqualTo(principal("2-888-D", PA));
assertThat(folder.getOpenDate()).isEqualTo(november4_2009);
assertThat(folder.getCloseDate()).isEqualTo(november4_2011);
assertThat(folder.getCopyRulesExpectedTransferDates()).containsExactly((LocalDate) null);
assertThat(folder.getCopyRulesExpectedDepositDates()).containsExactly((LocalDate) null);
assertThat(folder.getCopyRulesExpectedDestructionDates()).containsExactly((LocalDate) null);
assertThat(folder.getActualTransferDate()).isNull();
assertThat(folder.getActualDepositDate()).isNull();
assertThat(folder.getActualDestructionDate()).isNull();
assertThat(folder.getArchivisticStatus()).isSameAs(ACTIVE);
assertThat(folder.getCopyStatus()).isSameAs(PRINCIPAL);
assertThat(folder.getActiveRetentionType()).isSameAs(FIXED);
assertThat(folder.getSemiActiveRetentionType()).isSameAs(OPEN);
}
// -------------------------------------------------------------------------
private Folder folderWithCopyRule(CopyRetentionRule copyRetentionRule) {
RetentionRule rule = 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(rule);
folder.setCopyStatusEntered(copyRetentionRule.getCopyType());
folder.setOpenDate(new LocalDate(2014, 11, 4));
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.newRetentionRule();
retentionRule.setCode("Rule " + anInteger());
retentionRule.setTitle("Ze rule");
retentionRule.setApproved(true);
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);
}
}