Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Feat(bo): update custom message format #916

Merged
merged 2 commits into from
Nov 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

This file was deleted.

247 changes: 130 additions & 117 deletions dossierfacile-bo/src/main/java/fr/gouv/bo/service/TenantService.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
import fr.gouv.bo.dto.*;
import fr.gouv.bo.exception.DocumentNotFoundException;
import fr.gouv.bo.exception.GuarantorNotFoundException;
import fr.gouv.bo.lambda_interfaces.StringCustomMessage;
import fr.gouv.bo.lambda_interfaces.StringCustomMessageGuarantor;
import fr.gouv.bo.model.ProcessedDocuments;
import fr.gouv.bo.repository.*;
import fr.gouv.bo.security.UserPrincipal;
Expand Down Expand Up @@ -44,10 +42,6 @@
@Slf4j
public class TenantService {

private static final String LI_P = "<li><p>";
private static final String P_LI = "</p></li>";
private static final String BOLD_CLOSE = "</b> ";

private final Locale locale = LocaleContextHolder.getLocale();
private final TenantCommonRepository tenantRepository;
private final MailService mailService;
Expand All @@ -69,7 +63,6 @@ public class TenantService {
private final TenantMapperForMail tenantMapperForMail;
private final ApartmentSharingMapperForMail apartmentSharingMapperForMail;

private int forTenant = 0;
@Value("${time.reprocess.application.minutes}")
private int timeReprocessApplicationMinutes;

Expand Down Expand Up @@ -257,105 +250,145 @@ private boolean updateFileStatus(CustomMessage customMessage) {
return areAllDocumentsValid;
}

public Message sendCustomMessage(Tenant tenant, CustomMessage customMessage, int messageFrom) {
StringCustomMessage fileNameWithBold = str -> "<b>" + messageSource.getMessage(str, null, locale) + BOLD_CLOSE;
StringCustomMessageGuarantor fileNameWithBoldGuarantor = str -> "<b>" + messageSource.getMessage(str, null, locale) + " du garant</b> ";
private void processDocumentDeniedReasons(MessageItem messageItem, List<Long> documentDeniedReasonsIds) {
DocumentDeniedReasons documentDeniedReasons = new DocumentDeniedReasons();
for (ItemDetail itemDetail : messageItem.getItemDetailList()) {
if (itemDetail.isCheck()) {
documentDeniedReasons.getCheckedOptions().add(itemDetail.getFormattedMessage());
documentDeniedReasons.getCheckedOptionsId().add(itemDetail.getIdOptionMessage());
}
}

List<MessageItem> messageItems = customMessage.getMessageItems();
StringBuilder mailMessage = new StringBuilder();
mailMessage.append(messageSource.getMessage("bo.tenant.custom.email.head", null, locale));
mailMessage.append("<br/> <ul class='customMessage'>");
if (!messageItem.getCommentDoc().isEmpty()) {
documentDeniedReasons.setComment(messageItem.getCommentDoc());
}

if (!documentDeniedReasons.getCheckedOptionsId().isEmpty() || (documentDeniedReasons.getComment() != null && !documentDeniedReasons.getComment().isBlank())) {
Document document = documentRepository.findById(messageItem.getDocumentId()).orElseThrow(() -> new DocumentNotFoundException(messageItem.getDocumentId()));
documentDeniedReasons.setDocument(document);
documentDeniedReasonsRepository.save(documentDeniedReasons);
DocumentDeniedReasons documentDeniedReasonsToDelete = document.getDocumentDeniedReasons();
documentService.updateDocumentWithDocumentDeniedReasons(documentDeniedReasons, messageItem.getDocumentId());
if (documentDeniedReasonsToDelete != null) {
documentDeniedReasonsRepository.delete(documentDeniedReasonsToDelete);
}
documentDeniedReasonsIds.add(documentDeniedReasons.getId());
}
}

private void updateDocumentDeniedReasons(CustomMessage customMessage, Message message) {
List<Long> documentDeniedReasonsIds = new ArrayList<>();
if (messageFrom == 7 || messageFrom == 2) {
for (MessageItem messageItem : messageItems) {
DocumentDeniedReasons documentDeniedReasons = new DocumentDeniedReasons();
for (MessageItem messageItem : customMessage.getMessageItems()) {
processDocumentDeniedReasons(messageItem, documentDeniedReasonsIds);
}
for (GuarantorItem guarantorItem : customMessage.getGuarantorItems()) {
for (MessageItem messageItem : guarantorItem.getMessageItems()) {
processDocumentDeniedReasons(messageItem, documentDeniedReasonsIds);
}
}
if (!documentDeniedReasonsIds.isEmpty()) {
documentDeniedReasonsService.updateDocumentDeniedReasonsWithMessage(message, documentDeniedReasonsIds);
}
}

private String documentCategoryLabel(MessageItem msg) {
return messageSource.getMessage(msg.getDocumentCategory().getLabel(), null, locale);
}

private void appendDeniedReasons(StringBuilder html, String name, List<MessageItem> messageItems) {
html.append("<li>");
html.append("<strong class=\"name\">");
html.append(name);
html.append("</strong>");
for (MessageItem messageItem : messageItems) {
if (isDenied(messageItem)) {
html.append("<hr/><strong>");
html.append(documentCategoryLabel(messageItem));
html.append("</strong>");
html.append("<ul class=\"reasons\">");
for (ItemDetail itemDetail : messageItem.getItemDetailList()) {
if (itemDetail.isCheck()) {
mailMessage.append(LI_P);
mailMessage.append(fileNameWithBold.getFileNameWithBold(messageItem.getDocumentCategory().getLabel()));
mailMessage.append(itemDetail.getFormattedMessage());
mailMessage.append(P_LI);
documentDeniedReasons.getCheckedOptions().add(itemDetail.getFormattedMessage());
documentDeniedReasons.getCheckedOptionsId().add(itemDetail.getIdOptionMessage());
html.append("<li>");
html.append(itemDetail.getFormattedMessage());
html.append("</li>");
}
}

if (!messageItem.getCommentDoc().isEmpty()) {
mailMessage.append(LI_P);
mailMessage.append(fileNameWithBold.getFileNameWithBold(messageItem.getDocumentCategory().getLabel()));
mailMessage.append(messageItem.getCommentDoc());
mailMessage.append(P_LI);
documentDeniedReasons.setComment(messageItem.getCommentDoc());
html.append("<li>");
html.append(messageItem.getCommentDoc());
html.append("</li>");
}
html.append("</ul>");
}
}
html.append("</li>");
}

if (!documentDeniedReasons.getCheckedOptionsId().isEmpty() || (documentDeniedReasons.getComment() != null && !documentDeniedReasons.getComment().isBlank())) {
Document document = documentRepository.findById(messageItem.getDocumentId()).orElseThrow(() -> new DocumentNotFoundException(messageItem.getDocumentId()));
documentDeniedReasons.setDocument(document);
documentDeniedReasonsRepository.save(documentDeniedReasons);
DocumentDeniedReasons documentDeniedReasonsToDelete = document.getDocumentDeniedReasons();
documentService.updateDocumentWithDocumentDeniedReasons(documentDeniedReasons, messageItem.getDocumentId());
if (documentDeniedReasonsToDelete != null) {
documentDeniedReasonsRepository.delete(documentDeniedReasonsToDelete);
}
documentDeniedReasonsIds.add(documentDeniedReasons.getId());
}
private void appendCategoriesNames(StringBuilder html, List<MessageItem> messageItems) {
for (MessageItem messageItem : messageItems) {
if (isDenied(messageItem)) {
html.append("<li class=\"category-name\">");
html.append(documentCategoryLabel(messageItem));
html.append("</li>");
}
}
}

if (messageFrom == 7 || messageFrom == 5) {
for (GuarantorItem guarantorItem : customMessage.getGuarantorItems()) {
messageItems = guarantorItem.getMessageItems();
mailMessage.append("</ul>");
mailMessage.append(messageSource.getMessage("bo.tenant.custom.email.checkGuarantor", null, locale));
mailMessage.append("<ul class='customMessage'>");
for (MessageItem messageItem : messageItems) {
DocumentDeniedReasons documentDeniedReasons = new DocumentDeniedReasons();
for (ItemDetail itemDetail : messageItem.getItemDetailList()) {
if (itemDetail.isCheck()) {
mailMessage.append(LI_P);
mailMessage.append(fileNameWithBoldGuarantor.getFileNameWithBold(messageItem.getDocumentCategory().getLabel()));
mailMessage.append(itemDetail.getFormattedMessage());
mailMessage.append(P_LI);
documentDeniedReasons.getCheckedOptions().add(itemDetail.getMessage());
documentDeniedReasons.getCheckedOptionsId().add(itemDetail.getIdOptionMessage());
}
}
private String guarantorLabel(GuarantorItem guarantorItem) {
Long guarantorId = guarantorItem.getGuarantorId();
Guarantor guarantor = guarantorRepository.findById(guarantorId).orElseThrow(() -> new GuarantorNotFoundException(guarantorId));
return "Garant : " + guarantor.getCompleteName();
}

if (!messageItem.getCommentDoc().isEmpty()) {
mailMessage.append(LI_P);
mailMessage.append(fileNameWithBoldGuarantor.getFileNameWithBold(messageItem.getDocumentCategory().getLabel()));
mailMessage.append(messageItem.getCommentDoc());
mailMessage.append(P_LI);
documentDeniedReasons.setComment(messageItem.getCommentDoc());
}
public Message sendCustomMessage(Tenant tenant, CustomMessage customMessage) {
boolean forTenant = hasCheckedItem(customMessage.getMessageItems());
boolean forGuarantor = hasGuarantorCheckedItem(customMessage.getGuarantorItems());
if (!forTenant && !forGuarantor) {
return null;
}

if (!documentDeniedReasons.getCheckedOptionsId().isEmpty() || (documentDeniedReasons.getComment() != null && !documentDeniedReasons.getComment().isBlank())) {
Document document = documentRepository.findById(messageItem.getDocumentId()).orElseThrow(() -> new DocumentNotFoundException(messageItem.getDocumentId()));
documentDeniedReasons.setDocument(document);
documentDeniedReasonsRepository.save(documentDeniedReasons);
DocumentDeniedReasons documentDeniedReasonsToDelete = document.getDocumentDeniedReasons();
documentService.updateDocumentWithDocumentDeniedReasons(documentDeniedReasons, messageItem.getDocumentId());
if (documentDeniedReasonsToDelete != null) {
documentDeniedReasonsRepository.delete(documentDeniedReasonsToDelete);
}
documentDeniedReasonsIds.add(documentDeniedReasons.getId());
}
}
List<MessageItem> messageItems = customMessage.getMessageItems();
StringBuilder html = new StringBuilder();
html.append("<ul class=\"custom-message\"><li><p>");
html.append(messageSource.getMessage("bo.tenant.custom.email.head", null, locale));
html.append("</p>");

if (forTenant) {
html.append("<strong class=\"name\">");
html.append(tenant.getFirstName());
html.append("</strong>");
html.append("<ul class=\"doc-list\">");
appendCategoriesNames(html, messageItems);
html.append("</ul>");
}

for (GuarantorItem guarantorItem : customMessage.getGuarantorItems()) {
if (hasCheckedItem(guarantorItem.getMessageItems())) {
html.append("<strong class=\"name\">");
html.append(guarantorLabel(guarantorItem));
html.append("</strong>");
html.append("<ul class=\"doc-list\">");
appendCategoriesNames(html, guarantorItem.getMessageItems());
html.append("</ul>");
}
}
html.append("</li>");

mailMessage.append("</ul><br/><p>");
mailMessage.append(messageSource.getMessage("bo.tenant.custom.email.footer1", null, locale));
mailMessage.append("</p>");
if (messageFrom > 0) {
Message message = messageService.create(new MessageDTO(mailMessage.toString()), tenant, false, true);
if (!documentDeniedReasonsIds.isEmpty()) {
documentDeniedReasonsService.updateDocumentDeniedReasonsWithMessage(message, documentDeniedReasonsIds);
if (forTenant) {
appendDeniedReasons(html, tenant.getFirstName(), messageItems);
}
for (GuarantorItem guarantorItem : customMessage.getGuarantorItems()) {
if (hasCheckedItem(guarantorItem.getMessageItems())) {
appendDeniedReasons(html, guarantorLabel(guarantorItem), guarantorItem.getMessageItems());
}
return message;
}
return null;

html.append("<li>");
html.append(messageSource.getMessage("bo.tenant.custom.email.footer1", null, locale));
html.append("</li></ul>");
Message message = messageService.create(new MessageDTO(html.toString()), tenant, false, true);
updateDocumentDeniedReasons(customMessage, message);
return message;
}

@Transactional
Expand All @@ -380,37 +413,17 @@ public void declineTenant(Principal principal, Long tenantId) {
changeTenantStatusToDeclined(tenant, operator, null, ProcessedDocuments.NONE);
}

private int checkValueOfCustomMessage(CustomMessage customMessage) {

List<MessageItem> messageItems = customMessage.getMessageItems();
int allMessageResult = 0;

if (!messageItems.isEmpty()) {
for (MessageItem messageItem : messageItems) {
boolean messageItemCheck = messageItem.getItemDetailList().stream()
.anyMatch(ItemDetail::isCheck);
if (messageItemCheck || isNotEmpty(messageItem.getCommentDoc())) {
forTenant = 2;
allMessageResult = forTenant;
}
}
}
private boolean isDenied(MessageItem messageItem) {
boolean messageItemCheck = messageItem.getItemDetailList().stream().anyMatch(ItemDetail::isCheck);
return messageItemCheck || isNotEmpty(messageItem.getCommentDoc());
}

List<GuarantorItem> guarantorItems = customMessage.getGuarantorItems();
if (!guarantorItems.isEmpty()) {
for (GuarantorItem guarantorItem : guarantorItems) {
messageItems = guarantorItem.getMessageItems();
for (MessageItem messageItem : messageItems) {
boolean messageItemCheckGuarantor = messageItem.getItemDetailList().stream()
.anyMatch(ItemDetail::isCheck);
if (messageItemCheckGuarantor || isNotEmpty(messageItem.getCommentDoc())) {
allMessageResult = forTenant + 5;
}
}
}
}
private boolean hasCheckedItem(List<MessageItem> messageItems) {
return messageItems.stream().anyMatch(this::isDenied);
}

return allMessageResult;
private boolean hasGuarantorCheckedItem(List<GuarantorItem> guarantorItems) {
return guarantorItems.stream().anyMatch(item -> hasCheckedItem(item.getMessageItems()));
}

@Transactional
Expand All @@ -422,7 +435,7 @@ public String customMessage(Principal principal, Long tenantId, CustomMessage cu
}
User operator = userService.findUserByEmail(principal.getName());
updateFileStatus(customMessage);
Message message = sendCustomMessage(tenant, customMessage, checkValueOfCustomMessage(customMessage));
Message message = sendCustomMessage(tenant, customMessage);
changeTenantStatusToDeclined(tenant, operator, message, ProcessedDocuments.NONE);

return "redirect:/bo";
Expand Down Expand Up @@ -455,7 +468,7 @@ public void processFile(Long tenantId, CustomMessage customMessage, Principal pr
if (allDocumentsValid) {
changeTenantStatusToValidated(tenant, operator, processedDocuments);
} else {
Message message = sendCustomMessage(tenant, customMessage, checkValueOfCustomMessage(customMessage));
Message message = sendCustomMessage(tenant, customMessage);
changeTenantStatusToDeclined(tenant, operator, message, processedDocuments);
}
updateOperatorDateTimeTenant(tenantId);
Expand Down
4 changes: 2 additions & 2 deletions dossierfacile-bo/src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ yes=Oui
no=Non
apartmentSharing=Dossier
tenant.garant.title=Entrez les informations de votre garant
bo.tenant.custom.email.head=Veuillez procéder aux modifications suivantes pour valider votre dossier :
bo.tenant.custom.email.head=Bonjour,<br/>Nous avons examiné votre dossier et nous avons repéré des erreurs. Consultez nos commentaires ci-dessous et corrigez les erreurs indiquées.
bo.tenant.custom.email.option3=De toutes les pages de votre contrat de travail
bo.tenant.custom.email.option5=De vos fiches de paie pour les 3 derniers mois
bo.tenant.custom.email.checkGuarantor=Concernant les pièces justificatives de votre garant, veuillez procéder aux modifications suivantes :
bo.tenant.custom.email.footer1=Si la particularité de votre situation ne vous permet pas de répondre à ces demandes, indiquez-le nous simplement en répondant à ce message, afin que nous trouvions ensemble une solution à vos difficultés.
bo.tenant.custom.email.footer1=<p><strong>Merci de bien vouloir corriger toutes les erreurs afin que notre équipe puisse valider votre dossier.</strong></p><p>Attention : <strong>vous devez corriger toutes les erreurs indiquées.</strong> Les dossiers partiellement corrigés ne seront pas transmis à notre équipe. Ils ne seront donc jamais validés.</p>
file.process.accepted=Pièce validée
file.process.declined=Pièce non conforme
file.process.modified=Pièce modifiée
Expand Down
Loading