package com.constellio.app.modules.rm.extensions; import com.constellio.app.modules.rm.RMEmailTemplateConstants; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.navigation.RMNavigationConfiguration; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.DecommissioningList; import com.constellio.data.utils.TimeProvider; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.structures.EmailAddress; import com.constellio.model.extensions.behaviors.RecordExtension; import com.constellio.model.extensions.events.records.RecordCreationEvent; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.migrations.ConstellioEIMConfigs; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.users.UserServices; import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import static com.constellio.app.ui.i18n.i18n.$; public class RMCreateDecommissioningListExtension extends RecordExtension { private static Logger LOGGER = LoggerFactory.getLogger(RMCreateDecommissioningListExtension.class); String collection; ModelLayerFactory modelLayerFactory; RMSchemasRecordsServices rmSchemasRecordsServices; MetadataSchemasManager metadataSchemasManager; RecordServices recordServices; ConstellioEIMConfigs eimConfigs; public RMCreateDecommissioningListExtension(String collection, ModelLayerFactory modelLayerFactory) { this.modelLayerFactory = modelLayerFactory; this.collection = collection; this.rmSchemasRecordsServices = new RMSchemasRecordsServices(collection, modelLayerFactory); this.metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager(); this.recordServices = modelLayerFactory.newRecordServices(); this.eimConfigs = new ConstellioEIMConfigs(modelLayerFactory.getSystemConfigurationsManager()); } @Override public void recordCreated(RecordCreationEvent event) { if (event.isSchemaType(DecommissioningList.SCHEMA_TYPE)) { alertUsers(event.getRecord()); } super.recordCreated(event); } private void alertUsers(Record record) { try { DecommissioningList decommissioningList = rmSchemasRecordsServices.wrapDecommissioningList(record); String displayURL = ""; if(decommissioningList.getDecommissioningListType() != null) { switch (decommissioningList.getDecommissioningListType()) { case FOLDERS_TO_TRANSFER: case FOLDERS_TO_DESTROY: case FOLDERS_TO_DEPOSIT: case FOLDERS_TO_CLOSE: displayURL = RMNavigationConfiguration.DECOMMISSIONING_LIST_DISPLAY; break; default: displayURL = RMNavigationConfiguration.DOCUMENT_DECOMMISSIONING_LIST_DISPLAY; break; } } Transaction transaction = new Transaction(); UserServices userServices = modelLayerFactory.newUserServices(); List<User> userList = userServices.getAllUsersInCollection(collection); EmailToSend emailToSend = newEmailToSend(); List<EmailAddress> emailAddresses = new ArrayList<>(); for (User user : userList) { if(user.has(RMPermissionsTo.PROCESS_DECOMMISSIONING_LIST).on(record)) { emailAddresses.add(new EmailAddress(user.getTitle(), user.getEmail())); } } LocalDateTime creationDate = TimeProvider.getLocalDateTime(); emailToSend.setTo(emailAddresses); emailToSend.setSendOn(creationDate); final String subject = $("RMObject.alertWhenAvailableSubject", record.getTitle()); emailToSend.setSubject(subject); emailToSend.setTemplate(RMEmailTemplateConstants.DECOMMISSIONING_LIST_CREATION_TEMPLATE_ID); List<String> parameters = new ArrayList<>(); parameters.add("subject" + EmailToSend.PARAMETER_SEPARATOR + subject); parameters.add("returnDate" + EmailToSend.PARAMETER_SEPARATOR + formatDateToParameter(creationDate)); String rmObjectTitle = decommissioningList.getTitle(); parameters.add("title" + EmailToSend.PARAMETER_SEPARATOR + rmObjectTitle); String constellioUrl = eimConfigs.getConstellioUrl(); parameters.add("constellioURL" + EmailToSend.PARAMETER_SEPARATOR + constellioUrl); parameters.add("recordURL" + EmailToSend.PARAMETER_SEPARATOR + constellioUrl + "#!" + displayURL + "/" + record.getId()); emailToSend.setParameters(parameters); transaction.add(emailToSend); recordServices.execute(transaction); } catch (RecordServicesException e) { LOGGER.error("Cannot alert users", e); } } private String formatDateToParameter(LocalDateTime datetime) { if(datetime == null) { return ""; } return datetime.toString("yyyy-MM-dd HH:mm:ss"); } private EmailToSend newEmailToSend() { MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection); MetadataSchema schema = types.getSchemaType(EmailToSend.SCHEMA_TYPE).getDefaultSchema(); Record emailToSendRecord = recordServices.newRecordWithSchema(schema); return new EmailToSend(emailToSendRecord, types); } }