diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5c849a47..d0fb0136 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -537,6 +537,14 @@ public class GepafinConstant { public static final String APPLICATION_STATUS="applicationStatus"; public static final String RINALDO_EMAIL = "rinaldo.bonazzo@bflows.net"; + public static final String RESEND_EMAIL_SENT_SUCCESS_MSG = "resend.email.sent.success.msg"; + public static final String RESEND_EMAIL_SENT_FAILED_MSG = "resend.email.sent.failed.msg"; + public static final String REMINDER_EMAIL_FAILED_MSG = "reminder.email.sent.failed.msg"; + + + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index daa4391b..29935a03 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -140,6 +140,12 @@ public class ApplicationAmendmentRequestDao { @Autowired private ApplicationDao applicationDao; + @Autowired + private EmailLogRepository emailLogRepository; + + @Autowired + private EmailDao emailDao; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -300,6 +306,8 @@ public class ApplicationAmendmentRequestDao { log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); if (Boolean.TRUE.equals(applicationAmendmentRequestResponse.getIsSendEmail())) { emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); + EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); + applicationAmendmentRequestResponse.setEmailSendResponse(emailSendResponse); } return applicationAmendmentRequestResponse; } @@ -1168,12 +1176,13 @@ public class ApplicationAmendmentRequestDao { return response; } - public void sendReminderEmail(Long amendmentId) { + public EmailReminderResponse sendReminderEmail(Long amendmentId) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + EmailReminderResponse emailReminderResponse = new EmailReminderResponse(); if (entityOptional.isPresent()) { ApplicationEntity applicationEntity = applicationService.validateApplication(entityOptional.get().getApplicationId()); UserEntity beneficiaryUser = userService.validateUser(applicationEntity.getUserId()); @@ -1186,10 +1195,13 @@ public class ApplicationAmendmentRequestDao { EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(), RecipientTypeEnum.USER, beneficiaryUser.getId(), email, beneficiaryUser.getId(), applicationEntity.getId(), amendment.getId(), applicationEntity.getCall().getId()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest); + EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); + emailReminderResponse.setEmailSendResponse(emailSendResponse); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); } } + return emailReminderResponse; } private String prepareSubject(SystemEmailTemplateResponse template, ApplicationAmendmentRequestEntity amendment, UserEntity beneficiary) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e95e1c8b..2492e8b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1109,7 +1109,7 @@ public class ApplicationDao { if (userEntity.getBeneficiary() != null) { emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); email = userEntity.getBeneficiary().getEmail(); - emailLogRequest.setUserId(userEntity.getBeneficiary().getId()); + emailLogRequest.setRecipientId(userEntity.getBeneficiary().getId()); } emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); List recipientEmails = new ArrayList<>(); @@ -2134,4 +2134,42 @@ public class ApplicationDao { } + public void sendApplicationSubmissionFailureEmail(EmailLogRequest emailLogRequest){ + + Long callId = emailLogRequest.getCallId(); + CallEntity call = callService.validateCall(callId); + HubEntity hub = call.getHub(); + Long userId = emailLogRequest.getUserId(); + UserEntity user = userService.validateUser(userId); + Long applicationId = emailLogRequest.getApplicatioId(); + ApplicationEntity applicationEntity = validateApplication(applicationId); + CompanyEntity company = companyService.validateCompany(applicationEntity.getCompanyId()); + + + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_FAILURE_NOTIFICATION, + hub, null); + + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", call.getName()); + + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{scenario}}",emailLogRequest.getEmailType().getValue()); + bodyPlaceholders.put("{{call_name}}", call.getName()); + bodyPlaceholders.put("{{application_id}}", applicationEntity.getId().toString()); + bodyPlaceholders.put("{{company_name}}", company.getCompanyName()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{user_action_id}}",emailLogRequest.getUserActionId().toString()); + + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,user.getEmail(),user.getId(),applicationEntity.getId(),null,callId); + + emailLogRequest.setRecipientEmails(GepafinConstant.RINALDO_EMAIL); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(GepafinConstant.RINALDO_EMAIL),emailLogRequest); + } + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7052aad0..3adddf88 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -143,6 +143,9 @@ public class ApplicationEvaluationDao { @Autowired private ObjectMapper objectMapper; + @Autowired + private EmailDao emailDao; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { @@ -1876,7 +1879,7 @@ public class ApplicationEvaluationDao { assignedApplicationsEntity.getId()); ApplicationEvaluationEntity entity; - + EmailSendResponse emailSendResponse = new EmailSendResponse(); if (existingEntityOptional.isPresent()) { ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); // UserEntity userEntity = userService.validateUser(application.getUserId()); @@ -1888,6 +1891,8 @@ public class ApplicationEvaluationDao { application.setStatus(newStatus.getValue()); log.info("Status updated to ADMISSIBLE for applicationId: " + application.getId()); emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(application); + emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); + } if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ @@ -1944,13 +1949,16 @@ public class ApplicationEvaluationDao { application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity); + emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); } Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT); - return convertToResponse(entity); + ApplicationEvaluationResponse response = convertToResponse(entity); + response.setEmailSendResponse(emailSendResponse); + return response; } return null; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java new file mode 100644 index 00000000..cfde04c1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java @@ -0,0 +1,91 @@ +package net.gepafin.tendermanagement.dao; + + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; +import net.gepafin.tendermanagement.enums.RecipientTypeEnum; +import net.gepafin.tendermanagement.enums.StatusTypeEnum; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; +import net.gepafin.tendermanagement.model.response.EmailResendResponseBean; +import net.gepafin.tendermanagement.model.response.EmailSendResponse; +import net.gepafin.tendermanagement.repositories.EmailLogRepository; +import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.Utils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +@Component +@Log4j2 +public class EmailDao { + + @Autowired + EmailLogRepository emailLogRepository; + + @Autowired + EmailNotificationDao emailNotificationDao; + + @Autowired + private CallService callService; + + public EmailResendResponseBean resendEmail(HttpServletRequest request , Long userActionId){ + List emailLogs = emailLogRepository.findByUserActionIdAndEmailServiceType(userActionId,EmailServiceTypeEnum.PEC_SERVICE.getValue()); + if (emailLogs.isEmpty()) { + log.info("No emails found for given userActionId."); + } + EmailResendResponseBean emailResendResponseBean = new EmailResendResponseBean(); + for (EmailLogEntity log : emailLogs){ + EmailLogRequest emailLogRequest = new EmailLogRequest(); + emailLogRequest.setEmailType(EmailScenarioTypeEnum.valueOf(log.getEmailType())); + emailLogRequest.setRecipientType(RecipientTypeEnum.valueOf(log.getRecipientType())); + emailLogRequest.setRecipientId(log.getRecipientId()); + emailLogRequest.setUserId(log.getUserId()); + emailLogRequest.setApplicatioId(log.getApplicationId()); + emailLogRequest.setCallId(log.getCallId()); + emailLogRequest.setAmendmentId(log.getAmendmentId()); + + List recipients = Utils.commaSeparatedStringToList(log.getRecipientEmails()); + CallEntity call = callService.validateCall(log.getCallId()); + emailNotificationDao.sendMail( + call.getHub().getId(), + log.getEmailSubject(), + log.getEmailBody(), + recipients, + emailLogRequest + ); + } + EmailSendResponse emailSendResponse = buildEmailSendResponseFromRequest(request); + emailResendResponseBean.setEmailSendResponse(emailSendResponse); + return emailResendResponseBean; + } + + public EmailSendResponse buildEmailSendResponseFromRequest(HttpServletRequest request) { + Long userActionId = (Long) request.getAttribute(GepafinConstant.USER_ACTION_ID); + boolean isEmailSendSuccess = isEmailSentSuccessfully(userActionId); + EmailSendResponse emailSendResponse = new EmailSendResponse(); + emailSendResponse.setIsEmailSend(isEmailSendSuccess); + emailSendResponse.setUserActionId(userActionId); + return emailSendResponse; + } + + public boolean isEmailSentSuccessfully(Long userActionId) { + List emailLogs = emailLogRepository.findByUserActionId(userActionId); + + for (EmailLogEntity log : emailLogs) { + if (EmailServiceTypeEnum.PEC_SERVICE.getValue().equals(log.getEmailServiceType()) && + StatusTypeEnum.SUCCESS.getValue().equals(log.getSendStatus())) { + return true; + } + } + return false; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java index d74a6b3f..d95978fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.EmailLogEntity; import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; @@ -9,6 +10,7 @@ import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.repositories.EmailLogRepository; +import net.gepafin.tendermanagement.repositories.UserActionsRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +24,12 @@ public class EmailLogDao { @Autowired private EmailLogRepository emailLogRepository; + @Autowired + private HttpServletRequest request; + + @Autowired + private LoggingUtil loggingUtil; + public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest) { @@ -42,8 +50,8 @@ public class EmailLogDao { emailLogEntity.setApplicationId(emailLogRequest.getApplicatioId()); emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId()); emailLogEntity.setCallId(emailLogRequest.getCallId()); + emailLogEntity.setUserAction(loggingUtil.getUserActionLogById(emailLogRequest.getUserActionId())); emailLogEntity = saveEmailLogEntity(emailLogEntity); - return emailLogEntity; } public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){ @@ -52,6 +60,7 @@ public class EmailLogDao { public EmailLogRequest createEmailLogRequest(EmailScenarioTypeEnum emailType, RecipientTypeEnum recipientType, Long recipientId, String recipientEmails, Long userId,Long applicationId,Long amendmentId,Long callId) { EmailLogRequest emailLogRequest = new EmailLogRequest(); + Long userActionId =(Long) request.getAttribute(GepafinConstant.USER_ACTION_ID); emailLogRequest.setEmailType(emailType); emailLogRequest.setRecipientType(recipientType); emailLogRequest.setRecipientId(recipientId); @@ -60,6 +69,7 @@ public class EmailLogDao { emailLogRequest.setApplicatioId(applicationId); emailLogRequest.setAmendmentId(amendmentId); emailLogRequest.setCallId(callId); + emailLogRequest.setUserActionId(userActionId); return emailLogRequest; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 171ccbfa..3772ad71 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -139,7 +139,7 @@ public class EmailNotificationDao { } } } - if (rinaldoEmail != null) { + if (GepafinConstant.RINALDO_EMAIL.equals(rinaldoEmail)) { EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.PROPERTIES,null , rinaldoEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); @@ -283,12 +283,11 @@ public class EmailNotificationDao { if (recipientEmails.stream().anyMatch(email -> email.equals(GepafinConstant.RINALDO_EMAIL))) { emailConfig.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE.getValue()); EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); - emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); + emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); } else { emailConfig = retrieveEmailConfig(hubId); EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); - emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); - + emailService.sendEmail(subject, body, recipientEmails, emailConfig, emailLogRequest); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 37ae9b44..b682b184 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -15,6 +15,7 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.BeneficiaryRepository; +import net.gepafin.tendermanagement.repositories.EmailLogRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.RoleService; @@ -109,9 +110,15 @@ public class UserDao { @Autowired private EmailNotificationDao emailNotificationDao; + @Autowired + private EmailLogRepository emailLogRepository; + @Value("${fe.base.url}") private String feBaseUrl; + @Autowired + EmailDao emailDao; + public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { if (StringUtils.isEmpty(userReq.getHubUuid())) { @@ -134,7 +141,6 @@ public class UserDao { authenticationService.createSuccessLoginAttempt(loginAttemptEntity); } - JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId()); /** This code is responsible for adding a version history log for the "Create beneficiary" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(beneficiary).build()); @@ -142,12 +148,30 @@ public class UserDao { /** This code is responsible for adding a version history log for the "Create user" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(userEntity).build()); + EmailSendResponse emailSendResponse = new EmailSendResponse(); if(Boolean.FALSE.equals(roleEntity.getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))){ sendEmailToOnboardingUser(userEntity, userReq ); + boolean isEmailSendSuccess = isEmailSentSuccessfully(userEntity.getId()); + emailSendResponse.setIsEmailSend(isEmailSendSuccess); + Long userActionId =(Long)request.getAttribute(GepafinConstant.USER_ACTION_ID); + emailSendResponse.setUserActionId(userActionId); } + JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId(),emailSendResponse); return token; } - public void sendEmailToOnboardingUser(UserEntity userEntity,UserReq userReq){ + + public boolean isEmailSentSuccessfully(Long userId) { + Optional latestLogOpt = emailLogRepository + .findTopByUserIdAndEmailTypeAndIsDeletedFalseOrderByCreatedDateDesc(userId, EmailScenarioTypeEnum.USER_CREATION.getValue()); + + return latestLogOpt + .map(log -> StatusTypeEnum.SUCCESS.getValue().equals(log.getSendStatus())) + .orElse(false); + } + + + + public void sendEmailToOnboardingUser(UserEntity userEntity,UserReq userReq){ SystemEmailTemplateResponse emailTemplate; RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); @@ -459,7 +483,7 @@ public class UserDao { return user; } - public void initiatePasswordReset(InitiatePasswordResetReq resetReq) { + public InitiatePasswordResetResponse initiatePasswordReset(InitiatePasswordResetReq resetReq) { UserEntity user = userRepository.findUserExcludingRoleType( resetReq.getEmail(), resetReq.getHubUuid(), @@ -478,8 +502,11 @@ public class UserDao { loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldUserEntity).newData(user).build()); log.info("Password reset token generated for user: {}", resetReq.getEmail()); - sendResetPasswordTokenEmail(user, token); + InitiatePasswordResetResponse initiatePasswordResetResponse = new InitiatePasswordResetResponse(); + EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); + initiatePasswordResetResponse.setEmailSendResponse(emailSendResponse); + return initiatePasswordResetResponse; } public void sendResetPasswordTokenEmail(UserEntity user, String token) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 03ad4c2b..1a582a21 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -56,5 +56,9 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "is_deleted") private Boolean isDeleted; + + @ManyToOne + @JoinColumn(name = "user_action_id") + private UserActionEntity userAction; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index b2c3cfb7..92d97e9f 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -55,7 +55,8 @@ public class SystemEmailTemplatesEntity extends BaseEntity { USER_ONBOARDING_CONFIDI("USER_ONBOARDING_CONFIDI"), USER_ONBOARDING_BANDI("USER_ONBOARDING_BANDI"), PASSWORD_RESET("PASSWORD_RESET"), - INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"); + INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"), + APPLICATION_SUBMISSION_FAILURE_NOTIFICATION("APPLICATION_SUBMISSION_FAILURE_NOTIFICATION"); private String value; SystemEmailTemplatesEntityTypeEnum(String value) { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java index 479912d7..908e554d 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java @@ -11,7 +11,8 @@ public enum EmailScenarioTypeEnum { APPLICATION_ADMISSIBLE("APPLICATION_ADMISSIBLE"), USER_CREATION("USER_CREATION"), PASSWORD_RESET_REQUEST("PASSWORD_RESET_REQUEST"), - APPLICATION_REJECTED("APPLICATION_REJECTED"); + APPLICATION_REJECTED("APPLICATION_REJECTED"), + APPLICATION_SUBMISSION_FAILURE("APPLICATION_SUBMISSION_FAILURE"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java index 8957c03b..4430c2d6 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java @@ -14,7 +14,8 @@ public enum NotificationTypeEnum { EVALUATION_EXPIRED("EVALUATION_EXPIRED"), AMENDMENT_EXPIRATION_REMINDER("AMENDMENT_EXPIRATION_REMINDER"), EVALUATION_EXPIRATION_REMINDER("EVALUATION_EXPIRATION_REMINDER"), - COMPANY_DOCUMENT_EXPIRATION_REMINDER("COMPANY_DOCUMENT_EXPIRATION_REMINDER"); + COMPANY_DOCUMENT_EXPIRATION_REMINDER("COMPANY_DOCUMENT_EXPIRATION_REMINDER"), + PEC_EMAIL_SENDING_FAILURE("PEC_EMAIL_SENDING_FAILURE"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index a1f7ee5c..9fae6ce7 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -215,7 +215,9 @@ public enum UserActionContextEnum { GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"), UPDATE_CALL_END_DATE_AND_TIME("UPDATE_CALL_END_DATE_AND_TIME"), - UPDATE_EXPIRED_CALL("UPDATE_EXPIRED_CALL") ; + UPDATE_EXPIRED_CALL("UPDATE_EXPIRED_CALL"), + RESEND_EMAIL("RESEND_EMAIL"), + SEND_REMINDER_EMAIL("SEND_REMINDER_EMAIL"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java index 555d3298..11aecdbc 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java @@ -12,7 +12,8 @@ public enum UserActionLogsEnum { DOWNLOAD("DOWNLOAD"), UPLOAD("UPLOAD"), SCHEDULER("SCHEDULER"), - SCRIPT("SCRIPT"); + SCRIPT("SCRIPT"), + EMAIL("EMAIL"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java index b85f0e15..7cae845c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java @@ -37,4 +37,6 @@ public class EmailLogRequest { private Long callId; + private Long userActionId; + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index 8e8aeb83..ace60672 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -32,4 +32,5 @@ public class ApplicationAmendmentRequestResponse { private String internalNote; private ApplicationAmendmentRequestEnum status; private String emailTemplate; + private EmailSendResponse emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 47b018f9..187aa1dd 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -49,5 +49,6 @@ public class ApplicationEvaluationResponse { private EvaluationVersionEnum evaluationVersion; private String companyVatNumber; private String companyCodiceAteco; + private EmailSendResponse emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java new file mode 100644 index 00000000..d76b4fcd --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EmailReminderResponse { + + @JsonProperty("emailSendResponse") + private EmailSendResponse emailSendResponse; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EmailResendResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EmailResendResponseBean.java new file mode 100644 index 00000000..88f56e62 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EmailResendResponseBean.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class EmailResendResponseBean { + + private EmailSendResponse emailSendResponse; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EmailSendResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/EmailSendResponse.java new file mode 100644 index 00000000..c11d2c8d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EmailSendResponse.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class EmailSendResponse { + private Boolean isEmailSend; + private Long userActionId; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java new file mode 100644 index 00000000..c14ef643 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class InitiatePasswordResetResponse { + private EmailSendResponse emailSendResponse; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java index a57b7d59..a65f7d6e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java +++ b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.model.util; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import net.gepafin.tendermanagement.model.response.EmailSendResponse; import net.gepafin.tendermanagement.model.response.LoginResponse; /** @@ -15,10 +16,20 @@ public class JWTToken { @JsonProperty("user") private LoginResponse loginResponse; + + @JsonProperty("emailSendResponse") + private EmailSendResponse emailSendResponse; + public JWTToken(String token, LoginResponse loginResponse) { this.token = token; this.loginResponse = loginResponse; } + public JWTToken(String token, LoginResponse loginResponse, EmailSendResponse emailSendResponse) { + this.token = token; + this.loginResponse = loginResponse; + this.emailSendResponse = emailSendResponse; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java index 20475e0b..7ae53f22 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -1,11 +1,18 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface EmailLogRepository extends JpaRepository { List findByUserIdAndAmendmentIdAndIsDeletedFalse(Long userId,Long amendmentId); + List findByUserActionId(Long userActionId); + List findByUserActionIdAndEmailServiceType(Long userActionId, String emailServiceType); + + Optional findTopByUserIdAndEmailTypeAndIsDeletedFalseOrderByCreatedDateDesc(Long userId, String emailType); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index d54d49d3..b19f77c4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -8,10 +8,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentPagination import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestViewResponse; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; +import net.gepafin.tendermanagement.model.response.*; import java.util.List; @@ -29,6 +26,6 @@ public interface ApplicationAmendmentRequestService { public List getAmendmentByApplicationId(HttpServletRequest request,Long applicationId,List statuses); public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status); - void sendReminderEmail(HttpServletRequest request,Long amendmentId); + EmailReminderResponse sendReminderEmail(HttpServletRequest request, Long amendmentId); PageableResponseBean> getApplicationAmendmentByPaginnation(HttpServletRequest request, Long userId, ApplicationAmendmentPaginationRequestBean amendmentPaginationRequestBean); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ResendEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/ResendEmailService.java new file mode 100644 index 00000000..85275365 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/ResendEmailService.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.response.EmailResendResponseBean; + + +public interface ResendEmailService { + EmailResendResponseBean resendEmail(HttpServletRequest request , Long userActionId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index bbe69e5f..c8224f0c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -8,9 +8,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.UserSamlResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import java.util.List; @@ -28,7 +26,7 @@ public interface UserService { UserEntity validateUser(Long userId); - void initiatePasswordReset(InitiatePasswordResetReq resetReq); + InitiatePasswordResetResponse initiatePasswordReset(InitiatePasswordResetReq resetReq); Boolean resetPassword(ResetPasswordReq resetPasswordReq); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 1d7a38a9..a680ec1b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -12,10 +12,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentPagination import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestViewResponse; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; @@ -145,17 +142,18 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override - public void sendReminderEmail(HttpServletRequest request,Long amendmentId) { + public EmailReminderResponse sendReminderEmail(HttpServletRequest request, Long amendmentId) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + EmailReminderResponse response = new EmailReminderResponse(); Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); if (entityOptional.isPresent()) { UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); - - applicationAmendmentRequestDao.sendReminderEmail(amendmentId); + response = applicationAmendmentRequestDao.sendReminderEmail(amendmentId); } + return response; } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 12ea0123..e112d40e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -15,10 +15,7 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.response.CompanyResponse; -import net.gepafin.tendermanagement.model.response.LoginResponse; -import net.gepafin.tendermanagement.model.response.RoleResponseBean; -import net.gepafin.tendermanagement.model.response.UserSamlResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.LoginAttemptRepository; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; @@ -122,7 +119,7 @@ public class AuthenticationService { createFailedLoginAttempt(loginAttemptEntity, e.getMessage()); throw e; } - return getJWTTokenBean(user, loginReq.getRememberMe(), loginAttemptEntity.getId()); + return getJWTTokenBean(user, loginReq.getRememberMe(), loginAttemptEntity.getId(),null); } public LoginAttemptEntity prepareLoginAttemptEntity(LoginReq loginUserReq, HttpServletRequest request) { @@ -145,7 +142,7 @@ public class AuthenticationService { loginAttemptEntity.setErrorMsg(errorMsg); loginAttemptDao.createLoginAttempt(loginAttemptEntity); } - public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe, Long loginAttemptId) { + public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe, Long loginAttemptId, EmailSendResponse emailSendResponse) { UserEntity oldUserEntity = Utils.getClonedEntityForData(user); user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); user = userRepository.save(user); @@ -156,7 +153,7 @@ public class AuthenticationService { LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); - JWTToken jwtToken = new JWTToken(token, loginResponse); + JWTToken jwtToken = new JWTToken(token, loginResponse , emailSendResponse); /** This code is responsible for adding a version history log for the "Create user Or Update user" operation. **/ loggingUtil.addVersionHistoryWithoutToken(VersionHistoryRequest.builder().request(request).oldData(oldUserEntity).newData(user).actionType(VersionActionTypeEnum.UPDATE).build()); @@ -238,7 +235,7 @@ public class AuthenticationService { loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); loginAttemptEntity.setUserId(userEntity.getId()); LoginAttemptEntity loginAttempt = createSuccessLoginAttempt(loginAttemptEntity); - return getJWTTokenBean(userEntity, Boolean.TRUE, loginAttempt.getId()); + return getJWTTokenBean(userEntity, Boolean.TRUE, loginAttempt.getId(),null); } catch (Exception e) { log.info("Authentication login failed for email: {}",e.getMessage()); loginAttemptEntity.setUserId(userId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java index 8c44af9d..19742a8c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -1,25 +1,32 @@ package net.gepafin.tendermanagement.service.impl; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.dao.EmailLogDao; -import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.dao.NotificationDao; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; +import net.gepafin.tendermanagement.enums.NotificationTypeEnum; import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.EmailLogRequest; +import net.gepafin.tendermanagement.model.request.NotificationReq; import net.gepafin.tendermanagement.model.request.PecEmailRequest; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; -import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Slf4j @Service @@ -30,20 +37,26 @@ public class PecEmailService implements EmailService { @Value("${isPecServiceEnabled}") private String isPecServiceEnabled; - + @Autowired private Validator validator; @Autowired private EmailLogDao emailLogDao; + @Autowired + private NotificationDao notificationDao; + + @Autowired + private ApplicationDao applicationDao; + @Override public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) { if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) { return; } - + PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); emailRequest.setSubject(subject); @@ -67,13 +80,27 @@ public class PecEmailService implements EmailService { .header("Content-Type", "application/json") .body(Utils.convertObjectToJson(emailRequest)) // Serialize the emailRequest object to JSON .asString(); + + if (!isSuccessfulPecResponse(response2.getBody())) { + String errorMsg = "PEC sending failed: " + response2.getBody(); + emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); + emailLogRequest.setErrorMessage(errorMsg); + sendNotificationOnFailure(emailLogRequest.getUserId(),emailLogRequest.getEmailType()); + + if (EmailScenarioTypeEnum.APPLICATION_SUBMITTED.equals(emailLogRequest.getEmailType())) { + applicationDao.sendApplicationSubmissionFailureEmail(emailLogRequest); + } + } } }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); emailLogRequest.setErrorMessage(e.getMessage()); - emailLogDao.createEmailLog(emailLogRequest); - throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus()); + sendNotificationOnFailure(emailLogRequest.getUserId(),emailLogRequest.getEmailType()); + if (EmailScenarioTypeEnum.APPLICATION_SUBMITTED.equals(emailLogRequest.getEmailType())) { + applicationDao.sendApplicationSubmissionFailureEmail(emailLogRequest); + } } if(response2 != null) { emailLogRequest.setEmailServiceResponse(response2.getBody()); @@ -82,6 +109,57 @@ public class PecEmailService implements EmailService { emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); emailLogDao.createEmailLog(emailLogRequest); } + + private void sendNotificationOnFailure(Long userId, EmailScenarioTypeEnum emailScenarioTypeEnum) { + if (userId == null) { + log.warn("Cannot send notification: userId is null."); + return; + } + + Map placeholders = new HashMap<>(); + placeholders.put("{{email_scenario}}", emailScenarioTypeEnum.getValue()); + + NotificationReq notificationReq = notificationDao.createNotificationReq( + NotificationTypeEnum.PEC_EMAIL_SENDING_FAILURE.getValue(), + placeholders, + userId, + null, + null + ); + + try { + notificationDao.sendNotification(notificationReq); + log.info("Sent PEC failure notification to user {}", userId); + } catch (Exception e) { + log.error("Failed to send PEC failure notification to user {}: {}", userId, e.getMessage()); + } + } + + private boolean isSuccessfulPecResponse(String responseBody) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(responseBody); + + boolean success = jsonNode.has("success") && jsonNode.get("success").asBoolean(); + boolean hasNoError = !jsonNode.has("error") || jsonNode.get("error").isNull(); + + if (jsonNode.has("success") && !success) { + log.error("PEC response indicates failure: {}", responseBody); + return false; + } + + if (responseBody.contains("403") || responseBody.toLowerCase().contains("")) { + log.error("PEC response is a 403 HTML Forbidden page or invalid format: {}", responseBody); + return false; + } + + return success && hasNoError; + + } catch (Exception e) { + log.error("Invalid PEC response format: {}", responseBody); + return false; + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ResendEmailServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ResendEmailServiceImpl.java new file mode 100644 index 00000000..bfe199b3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ResendEmailServiceImpl.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.EmailDao; +import net.gepafin.tendermanagement.model.response.EmailResendResponseBean; +import net.gepafin.tendermanagement.service.ResendEmailService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ResendEmailServiceImpl implements ResendEmailService { + + @Autowired + Validator validator; + + @Autowired + EmailDao emailDao; + + @Override + public EmailResendResponseBean resendEmail(HttpServletRequest request, Long userActionId) { + validator.validateUser(request); + return emailDao.resendEmail(request,userActionId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java index fde6fd3e..95939082 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java @@ -55,7 +55,7 @@ public class SystemEmailService implements EmailService { emailLogRequest.setEmailBody(body); emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); - + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE); if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { MessageResponse response = null; try { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 0b13ef44..d2c2b032 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -11,9 +11,7 @@ import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.UserSamlResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -78,8 +76,8 @@ public class UserServiceImpl implements UserService { } @Override - public void initiatePasswordReset(InitiatePasswordResetReq resetReq) { - userDao.initiatePasswordReset(resetReq); + public InitiatePasswordResetResponse initiatePasswordReset(InitiatePasswordResetReq resetReq) { + return userDao.initiatePasswordReset(resetReq); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 343e742a..31f3c81c 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -1011,5 +1011,15 @@ public class Utils { } } + public static List commaSeparatedStringToList(String emails) { + if (emails == null || emails.isEmpty()) { + return new ArrayList<>(); + } + return Arrays.stream(emails.split(",")) + .map(String::trim) + .collect(Collectors.toList()); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index eb0c05f0..5d81ce7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -183,7 +183,7 @@ public interface ApplicationAmendmentRequestApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) @PostMapping(value = "/{amendmentId}/reminder", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> sendReminderEmail(HttpServletRequest request, + ResponseEntity> sendReminderEmail(HttpServletRequest request, @Parameter( required = true) @PathVariable(value = "amendmentId") Long amendmentId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EmailApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EmailApi.java new file mode 100644 index 00000000..2bbeca34 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EmailApi.java @@ -0,0 +1,40 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.EmailResendResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +@Validated +public interface EmailApi { + @Operation(summary = "Api to resend the email", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/resend", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> resendEmail( + HttpServletRequest request, + @Parameter(description = "The User Action ID", required = true) + @RequestParam("userActionId") Long userActionId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 6f7aaf8e..3f0d9410 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -10,10 +10,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; -import net.gepafin.tendermanagement.model.response.UserSamlResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -121,8 +118,8 @@ public interface UserApi { @RequestMapping(value = "/reset-password/initiate", produces = {"application/json"}, method = RequestMethod.POST) - ResponseEntity> initiatePasswordReset(HttpServletRequest request, - @Parameter(description = "Initiate password reset request object", required = true) @Valid @RequestBody InitiatePasswordResetReq initiatePasswordResetReq); + ResponseEntity> initiatePasswordReset(HttpServletRequest request, + @Parameter(description = "Initiate password reset request object", required = true) @Valid @RequestBody InitiatePasswordResetReq initiatePasswordResetReq); @Operation(summary = "Api to reset password", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index 585a6d1e..c92a060b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -8,10 +8,7 @@ import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestViewResponse; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -176,15 +173,25 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); } @Override - public ResponseEntity> sendReminderEmail( + public ResponseEntity> sendReminderEmail( HttpServletRequest request, Long amendmentId) { log.info("Sending reminder email for Amendment ID: {}", amendmentId); - applicationAmendmentRequestService.sendReminderEmail(request,amendmentId); + + /** This code is responsible for "sending reminder email" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.EMAIL) + .actionContext(UserActionContextEnum.SEND_REMINDER_EMAIL).build()); + + EmailReminderResponse emailSendResponse = applicationAmendmentRequestService.sendReminderEmail(request,amendmentId); + + if (!emailSendResponse.getEmailSendResponse().getIsEmailSend()) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(emailSendResponse, Status.EXCEPTION_ERROR, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_FAILED_MSG))); + } return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_SENT_SUCCESS_MSG))); + .body(new Response<>(emailSendResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_SENT_SUCCESS_MSG))); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EmailApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EmailApiController.java new file mode 100644 index 00000000..59d55ac0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EmailApiController.java @@ -0,0 +1,52 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.EmailResendResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.ResendEmailService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.EmailApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/email}") +@Log4j2 +public class EmailApiController implements EmailApi { + + @Autowired + LoggingUtil loggingUtil; + + @Autowired + ResendEmailService emailService; + + @Override + public ResponseEntity> resendEmail(HttpServletRequest request, Long userActionId) { + + /** This code is responsible for creating user action logs for the "Resend Email" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT) + .actionContext(UserActionContextEnum.RESEND_EMAIL).build()); + + EmailResendResponseBean emailResendResponseBean = emailService.resendEmail(request, userActionId); + + if (!emailResendResponseBean.getEmailSendResponse().getIsEmailSend()) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(emailResendResponseBean, Status.EXCEPTION_ERROR, Translator.toLocale(GepafinConstant.RESEND_EMAIL_SENT_FAILED_MSG))); + } + + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(emailResendResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESEND_EMAIL_SENT_SUCCESS_MSG))); + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index 14945d65..3e262b77 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -11,9 +11,7 @@ import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.PageableResponseBean; -import net.gepafin.tendermanagement.model.response.UserSamlResponse; -import net.gepafin.tendermanagement.model.response.UserResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserService; @@ -135,16 +133,16 @@ public class UserApiController implements UserApi { return ResponseEntity.ok(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.SUCCESS_PASSWORD_CHANGED))); } @Override - public ResponseEntity> initiatePasswordReset(HttpServletRequest httpServletRequest,InitiatePasswordResetReq request) { + public ResponseEntity> initiatePasswordReset(HttpServletRequest httpServletRequest, InitiatePasswordResetReq request) { log.info("Initiating password reset for email: {}", request.getEmail()); /** This code is responsible for "Initiating Password Reset Request" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPDATE) .actionContext(UserActionContextEnum.INITIATE_PASSWORD_RESET_REQUEST).build()); - userService.initiatePasswordReset(request); + InitiatePasswordResetResponse emailSendResponse = userService.initiatePasswordReset(request); log.info("Password reset token generated for email: {}", request.getEmail()); - return ResponseEntity.ok(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESET_PASSWORD_INITIATED))); + return ResponseEntity.ok(new Response<>(emailSendResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESET_PASSWORD_INITIATED))); } @Override diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 38e13676..9d507532 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2746,4 +2746,23 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/insert_system_email_template_for_application_submission_failure_30_04_2025.sql b/src/main/resources/db/dump/insert_system_email_template_for_application_submission_failure_30_04_2025.sql new file mode 100644 index 00000000..a1e0b030 --- /dev/null +++ b/src/main/resources/db/dump/insert_system_email_template_for_application_submission_failure_30_04_2025.sql @@ -0,0 +1,46 @@ +INSERT INTO gepafin_schema.system_email_template ( + template_name, + "type", + html_content, + subject, + "json", + "system", + is_deleted, + created_date, + updated_date, + email_scenario) + VALUES ( + 'Application submission failure notification', + 'APPLICATION_SUBMISSION_FAILURE_NOTIFICATION', + ' + +
+

Buongiorno,

+ +

+ Si prega di notare che si è verificato un errore durante linvio dell email "{{scenario}}" per la chiamata: {{call_name}}.

+

+ Dettagli:
+ - ID Applicazione: {{application_id}}
+ - Nome Azienda: {{company_name}}
+ - Numero Protocollo: {{protocol_number}}
+ - ID Azione Utente: {{user_action_id}} +

+ +

+ Si prega di effettuare i controlli appropriati e di adottare le misure correttive necessarie. +

+ +

Cordiali saluti,

+

Gepafin S.p.a.

+
+ + ', + 'ERRORE INVIO EMAIL - BANDO {{call_name}}', + NULL, + true, + false, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP, + 'APPLICATION_SUBMISSION_FAILURE' +); \ No newline at end of file diff --git a/src/main/resources/db/dump/update_json_template_for_notification_22_04_2025.sql b/src/main/resources/db/dump/update_json_template_for_notification_22_04_2025.sql new file mode 100644 index 00000000..9aefaedf --- /dev/null +++ b/src/main/resources/db/dump/update_json_template_for_notification_22_04_2025.sql @@ -0,0 +1,9 @@ +INSERT INTO notification_type (notification_name, title, json_template, created_date, updated_date, is_deleted) +VALUES +('PEC_EMAIL_SENDING_FAILURE', + 'Invio Email Fallito', + 'Non è stato possibile inviare lemail per lo scenario: {{email_scenario}}.', + '2025-01-03T10:16:26.472Z', + '2025-01-03T10:16:26.472Z', + 'false' +); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e67042ab..b09c8d62 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -400,3 +400,7 @@ insufficient.score.msg = Insufficient score to pass to the technical and economi password.expired.for.login.to.odessa = Odessa login password has been expired. invalid.user=Invalid user. + +reminder.email.sent.failed.msg = Failed to send reminder email +resend.email.sent.success.msg = Email resend successfully +resend.email.sent.failed.msg = Failed to resend the email. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index fd7f09e1..faafb940 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -390,4 +390,8 @@ insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazion validation.table.message=I dati per il campo {0} non sono presenti. password.expired.for.login.to.odessa = La password di accesso a Odessa è scaduta -invalid.user=Utente non valido. \ No newline at end of file +invalid.user=Utente non valido. + +reminder.email.sent.failed.msg = Impossibile inviare l'e-mail di promemoria +resend.email.sent.success.msg = Email reinviata con successo +resend.email.sent.failed.msg = Impossibile inviare nuovamente l'e-mail. \ No newline at end of file