package com.constellio.app.modules.rm.extensions; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.borrowingServices.BorrowingServices; import com.constellio.app.modules.rm.services.borrowingServices.BorrowingType; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService; import com.constellio.app.modules.rm.wrappers.RMTask; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.model.wrappers.request.*; import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.extensions.behaviors.RecordExtension; import com.constellio.model.extensions.events.records.RecordInModificationBeforeSaveEvent; import com.constellio.model.services.logging.LoggingServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.users.UserServices; import org.joda.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import static java.util.Arrays.asList; /** * Created by Constellio on 2017-03-23. */ public class RMRequestTaskApprovedExtension extends RecordExtension { private static Logger LOGGER = LoggerFactory.getLogger(RMRequestTaskApprovedExtension.class); String collection; AppLayerFactory appLayerFactory; TasksSchemasRecordsServices tasksSchemas; RMSchemasRecordsServices rmSchemas; BorrowingServices borrowingServices; DecommissioningService decommissioningService; UserServices userServices; LoggingServices loggingServices; public RMRequestTaskApprovedExtension(String collection, AppLayerFactory appLayerFactory) { this.collection = collection; this.appLayerFactory = appLayerFactory; this.tasksSchemas = new TasksSchemasRecordsServices(collection, appLayerFactory); this.rmSchemas = new RMSchemasRecordsServices(collection, appLayerFactory); this.borrowingServices = new BorrowingServices(collection, appLayerFactory.getModelLayerFactory()); this.userServices = appLayerFactory.getModelLayerFactory().newUserServices(); this.loggingServices = appLayerFactory.getModelLayerFactory().newLoggingServices(); this.decommissioningService = new DecommissioningService(collection, appLayerFactory); } @Override public void recordInModificationBeforeSave(RecordInModificationBeforeSaveEvent event) { if(event.isSchemaType(Task.SCHEMA_TYPE)) { RMTask task = rmSchemas.wrapRMTask(event.getRecord()); List<String> acceptedSchemas = new ArrayList<>(asList(BorrowRequest.FULL_SCHEMA_NAME, ReturnRequest.FULL_SCHEMA_NAME, ReactivationRequest.FULL_SCHEMA_NAME, ExtensionRequest.FULL_SCHEMA_NAME)); String schemaCode = task.getSchemaCode(); if(event.hasModifiedMetadata(Task.STATUS) && tasksSchemas.getTaskStatus(task.getStatus()).isFinished() && acceptedSchemas.contains(schemaCode)) { String typeCode = task.getType() == null ? "":tasksSchemas.getTaskType(task.getType()).getCode(); boolean isAccepted = Boolean.TRUE.equals(task.get(BorrowRequest.ACCEPTED)); try { if(typeCode.equals(BorrowRequest.SCHEMA_NAME)) { completeBorrowRequest(task, isAccepted); } else if(typeCode.equals(ReturnRequest.SCHEMA_NAME)) { completeReturnRequest(task, isAccepted); } else if(typeCode.equals(ReactivationRequest.SCHEMA_NAME)) { completeReactivationRequest(task, isAccepted); } else if(typeCode.equals(ExtensionRequest.SCHEMA_NAME)) { completeBorrowExtensionRequest(task, isAccepted); } } catch (Exception e) { LOGGER.error(e.getMessage()); throw new RuntimeException(e.getMessage()); } } } } public void completeBorrowRequest(RMTask task, boolean isAccepted) throws RecordServicesException { User applicant = rmSchemas.getUser((String) task.get(RequestTask.APPLICANT)); User respondant = rmSchemas.getUser((String) task.get(RequestTask.RESPONDANT)); Double borrowDuration = task.get(BorrowRequest.BORROW_DURATION); int numberOfDays = borrowDuration == null? 0:borrowDuration.intValue(); borrowingServices.borrowRecordsFromTask(task.getId(), LocalDate.now(), LocalDate.now().plusDays(numberOfDays), respondant, applicant, BorrowingType.BORROW, isAccepted); } public void completeReturnRequest(RMTask task, boolean isAccepted) throws RecordServicesException { User applicant = rmSchemas.getUser((String) task.get(RequestTask.APPLICANT)); User respondant = rmSchemas.getUser((String) task.get(RequestTask.RESPONDANT)); borrowingServices.returnRecordsFromTask(task.getId(), LocalDate.now(), respondant, applicant, isAccepted); } public void completeReactivationRequest(RMTask task, boolean isAccepted) throws RecordServicesException { User applicant = rmSchemas.getUser((String) task.get(RequestTask.APPLICANT)); User respondant = rmSchemas.getUser((String) task.get(RequestTask.RESPONDANT)); decommissioningService.reactivateRecordsFromTask(task.getId(), (LocalDate) task.get(ReactivationRequest.REACTIVATION_DATE), respondant, applicant, isAccepted); } public void completeBorrowExtensionRequest(RMTask task, boolean isAccepted) throws RecordServicesException { User applicant = rmSchemas.getUser((String) task.get(RequestTask.APPLICANT)); User respondant = rmSchemas.getUser((String) task.get(RequestTask.RESPONDANT)); LocalDate returnDate = task.get(ExtensionRequest.EXTENSION_VALUE); borrowingServices.extendRecordsBorrowingPeriodFromTask(task.getId(), returnDate, respondant, applicant, isAccepted); } }