diff --git a/.gitignore b/.gitignore index 3452256da..8c2e218bc 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ application-*.properties !application-test.properties document_analysis.properties .env +dossierfacile-process-file/testResult/ target/ mockstorage/ mock-storage/ @@ -14,6 +15,7 @@ logs/ hs_err_pid*.log tmp **/certs/* +elastalert/dist ### STS ### .apt_generated diff --git a/Aptfile b/Aptfile index 74914b3f9..195407fa1 100644 --- a/Aptfile +++ b/Aptfile @@ -1,3 +1,5 @@ ttf-mscorefonts-installer tesseract-ocr imagemagick +libblas-dev +libopencv-dev diff --git a/Procfile b/Procfile index eca6648bc..aa39a3599 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: java $JVM_OPTIONS -Djna.library.path=$JNA_LIBRARY_PATH -jar $APP_DIR/target/$APP_DIR.jar +web: bash bin/start.sh diff --git a/bin/start.sh b/bin/start.sh new file mode 100755 index 000000000..c6f8271a7 --- /dev/null +++ b/bin/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +ln -s /app/.apt/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3 /app/.apt/usr/lib/x86_64-linux-gnu/ +ln -s /app/.apt/usr/lib/x86_64-linux-gnu/blas/libblas.so.3 /app/.apt/usr/lib/x86_64-linux-gnu/ + +java $JVM_OPTIONS -Djna.library.path=$JNA_LIBRARY_PATH -jar $APP_DIR/target/$APP_DIR.jar diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BODocumentDeniedOptionsController.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BODocumentDeniedOptionsController.java index fd427e6b0..ba9f1bac1 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BODocumentDeniedOptionsController.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BODocumentDeniedOptionsController.java @@ -23,7 +23,7 @@ public class BODocumentDeniedOptionsController { private static final String EMAIL = "email"; - private static final List DOCUMENT_USER_TYPES = List.of("tenant", "guarantor"); + private static final List DOCUMENT_USER_TYPES = List.of("tenant", "guarantor", "all"); private final DocumentDeniedOptionsService service; diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BOTenantController.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BOTenantController.java index 6b72ea69d..25b3b1176 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BOTenantController.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/controller/BOTenantController.java @@ -218,10 +218,10 @@ private static String redirectToTenantPage(Tenant tenant) { return "redirect:/bo/colocation/" + tenant.getApartmentSharing().getId() + "#tenant" + tenant.getId(); } - private List getItemDetailForSubcategoryOfDocument(DocumentSubCategory documentSubCategory, String tenantOrGuarantor) { + private List getItemDetailForSubcategoryOfDocument(DocumentSubCategory documentSubCategory, String documentUserType) { List itemDetails = new ArrayList<>(); - for (DocumentDeniedOptions documentDeniedOptions : documentService.findDocumentDeniedOptionsByDocumentSubCategoryAndDocumentUserType(documentSubCategory, tenantOrGuarantor)) { + for (DocumentDeniedOptions documentDeniedOptions : documentService.findDocumentDeniedOptionsByDocumentSubCategoryAndDocumentUserTypeIncludeGeneric(documentSubCategory, documentUserType)) { ItemDetail itemDetail1 = ItemDetail.builder() .check(false) .message(documentDeniedOptions.getMessageValue()) diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/repository/DocumentDeniedOptionsRepository.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/repository/DocumentDeniedOptionsRepository.java index bee2abeea..5fedaf4ec 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/repository/DocumentDeniedOptionsRepository.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/repository/DocumentDeniedOptionsRepository.java @@ -3,6 +3,7 @@ import fr.dossierfacile.common.entity.DocumentDeniedOptions; import fr.dossierfacile.common.enums.DocumentSubCategory; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; @@ -12,4 +13,17 @@ public interface DocumentDeniedOptionsRepository extends JpaRepository findAllByDocumentSubCategory(DocumentSubCategory documentSubCategory); + @Query(value = """ + select * + from document_denied_options + where (document_user_type = 'all' or document_user_type = :documentUserType) + and (document_sub_category = 'UNDEFINED' or document_sub_category = :documentSubCategory) + ORDER BY + CASE + WHEN document_sub_category = 'UNDEFINED' THEN 1 + ELSE 0 + END, code + """, nativeQuery = true) + List findAllByDocumentSubCategoryAndDocumentUserTypeIncludeGeneric(String documentSubCategory, String documentUserType); + } diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/DocumentService.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/DocumentService.java index 588089263..0ccae3262 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/DocumentService.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/DocumentService.java @@ -108,7 +108,7 @@ public void updateDocumentWithDocumentDeniedReasons(DocumentDeniedReasons docume documentRepository.updateDocumentWithDocumentDeniedReasons(documentDeniedReasons, documentId); } - public List findDocumentDeniedOptionsByDocumentSubCategoryAndDocumentUserType(DocumentSubCategory documentSubCategory, String tenantOrGuarantor) { - return documentDeniedOptionsRepository.findAllByDocumentSubCategoryAndDocumentUserTypeOrderByCode(documentSubCategory, tenantOrGuarantor); + public List findDocumentDeniedOptionsByDocumentSubCategoryAndDocumentUserTypeIncludeGeneric(DocumentSubCategory documentSubCategory, String documentUserType) { + return documentDeniedOptionsRepository.findAllByDocumentSubCategoryAndDocumentUserTypeIncludeGeneric(documentSubCategory.name(), documentUserType); } } diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantLogService.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantLogService.java index 5c243067c..07cb836b8 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantLogService.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantLogService.java @@ -1,10 +1,14 @@ package fr.gouv.bo.service; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import fr.dossierfacile.common.entity.Document; import fr.dossierfacile.common.entity.Tenant; import fr.dossierfacile.common.entity.TenantLog; import fr.dossierfacile.common.enums.LogType; +import fr.dossierfacile.common.model.log.EditedDocument; +import fr.dossierfacile.common.model.log.EditionType; import fr.gouv.bo.repository.BoTenantLogRepository; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -48,11 +52,22 @@ public void addOperatorCommentLog(Tenant tenant, String operatorComment) { .logType(LogType.OPERATOR_COMMENT) .tenantId(tenant.getId()) .creationDateTime(LocalDateTime.now()) - .logDetails(writeAsString(Map.of("comment", operatorComment))) + .logDetails(writeAsObjectNode(Map.of("comment", operatorComment))) .build(); saveByLog(log); } + public void addDeleteDocumentLog(Long tenantId, Long operatorId, Document document) { + TenantLog log = TenantLog.builder() + .logType(LogType.ACCOUNT_EDITED) + .tenantId(tenantId) + .operatorId(operatorId) + .creationDateTime(LocalDateTime.now()) + .logDetails(writeAsObjectNode(EditedDocument.from(document, EditionType.DELETE))) + .build(); + saveByLog(log); + } + public List listLastTreatedFilesByOperator(Long operatorId, int minusDays) { return logRepository.countTreatedFromXDaysGroupByDate(operatorId, minusDays); } @@ -61,12 +76,14 @@ public List listDailyTreatedFilesByOperator() { return logRepository.countTreatedFromTodayGroupByOperator(); } - private String writeAsString(Object object) { + private ObjectNode writeAsObjectNode(Object object) { try { - return objectMapper.writeValueAsString(object); - } catch (JsonProcessingException e) { - log.error("FATAL: Cannot write log details as string", e); + return (ObjectNode) objectMapper.valueToTree(object); + } catch (IllegalArgumentException e) { + log.error("FATAL: Cannot write log details as object node", e); } return null; } + + } diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantService.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantService.java index 6982d3fb5..d2cd0b1e5 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantService.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantService.java @@ -261,6 +261,14 @@ private void processDocumentDeniedReasons(MessageItem messageItem, List do if (!documentDeniedReasons.getCheckedOptionsId().isEmpty() || (documentDeniedReasons.getComment() != null && !documentDeniedReasons.getComment().isBlank())) { Document document = documentRepository.findById(messageItem.getDocumentId()).orElseThrow(() -> new DocumentNotFoundException(messageItem.getDocumentId())); documentDeniedReasons.setDocument(document); + documentDeniedReasons.setDocumentCategory(document.getDocumentCategory()); + documentDeniedReasons.setDocumentSubCategory(document.getDocumentSubCategory()); + documentDeniedReasons.setDocumentCategoryStep(document.getDocumentCategoryStep()); + if (document.getGuarantor() != null) { + documentDeniedReasons.setDocumentTenantType("guarantor"); + } else { + documentDeniedReasons.setDocumentTenantType("tenant"); + } documentDeniedReasonsRepository.save(documentDeniedReasons); DocumentDeniedReasons documentDeniedReasonsToDelete = document.getDocumentDeniedReasons(); documentService.updateDocumentWithDocumentDeniedReasons(documentDeniedReasons, messageItem.getDocumentId()); @@ -773,7 +781,9 @@ public Optional getOldestToProcessApplication() { @Transactional public Tenant deleteDocument(Long id, User operator) { + Document document = documentService.findDocumentById(id); Tenant tenant = documentService.deleteDocument(id); + tenantLogService.addDeleteDocumentLog(tenant.getId(), operator.getId(), document); apartmentSharingService.resetDossierPdfGenerated(tenant.getApartmentSharing()); updateTenantStatus(tenant, operator); return tenant; diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/UserService.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/UserService.java index 3ae005032..4c15345e2 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/service/UserService.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/service/UserService.java @@ -1,7 +1,7 @@ package fr.gouv.bo.service; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.Gson; import fr.dossierfacile.common.entity.*; import fr.dossierfacile.common.enums.*; @@ -89,7 +89,7 @@ private void saveAndDeleteInfoByTenant(Tenant tenant, BOUser operator) { .logType(LogType.ACCOUNT_DELETE) .tenantId(tenant.getId()) .operatorId(operator.getId()) - .jsonProfile(writeValueAsString(tenantMapper.toTenantModel(tenant))) + .jsonProfile(writeAsObjectNode(tenantMapper.toTenantModel(tenant))) .creationDateTime(LocalDateTime.now()) .build()); } @@ -184,11 +184,11 @@ public void createUserByEmail(String email, Role role) { addRoles(userRepository.save(user), Collections.singletonList(role)); } - private String writeValueAsString(Object object) { + private ObjectNode writeAsObjectNode(Object object) { try { - return objectMapper.writeValueAsString(object); - } catch (JsonProcessingException e) { - log.error("FATAL: Something very bad happened " + object.getClass(), e); + return objectMapper.valueToTree(object); + } catch (IllegalArgumentException e) { + log.error("FATAL: cannot write jsonProfile as object node", e); } return null; } diff --git a/dossierfacile-bo/src/main/resources/templates/bo/apartment-sharing-view.html b/dossierfacile-bo/src/main/resources/templates/bo/apartment-sharing-view.html index ffb48a5f9..cd17cd573 100644 --- a/dossierfacile-bo/src/main/resources/templates/bo/apartment-sharing-view.html +++ b/dossierfacile-bo/src/main/resources/templates/bo/apartment-sharing-view.html @@ -346,7 +346,7 @@

Liste des liens envoyés: