diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index d0a6f0c8..4a80f94e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -9,10 +9,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.*; -import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; -import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; -import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; -import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; @@ -98,6 +95,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private Validator validator; + @Autowired + private EmailLogDao emailLogDao; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -579,7 +579,8 @@ public class ApplicationAmendmentRequestDao { String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER.getValue(),RecipientTypeEnum.BENEFICIARY,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(),EmailTrackingEntityTypeEnum.AMENDMENT,beneficiaryUser); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a51d9be1..1cf5da7a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -4,15 +4,11 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; -import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.AmazonS3Service; @@ -138,6 +134,9 @@ public class ApplicationDao { @Autowired private EmailNotificationDao emailNotificationDao; + @Autowired + private EmailLogDao emailLogDao; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); // callService.validatePublishedCall(formEntity.getCall().getId()); @@ -734,7 +733,8 @@ public class ApplicationDao { if (userEntity.getBeneficiary() != null) { email = userEntity.getBeneficiary().getEmail(); } - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_USER_AND_COMPANY.getValue(),RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(),EmailTrackingEntityTypeEnum.APPLICATION,userEntity); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); List recipientEmails = new ArrayList<>(); recipientEmails.add(email); String companyEmail = company.getEmail(); @@ -747,7 +747,7 @@ public class ApplicationDao { if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { recipientEmails.add(contactEmail); } - emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails); + emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest); } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { CallEntity call = applicationEntity.getCall(); @@ -774,17 +774,18 @@ public class ApplicationDao { String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_GEPAFIN.getValue(),RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(),EmailTrackingEntityTypeEnum.APPLICATION,userEntity); // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); if(validator.isProductionProfileActivated()) { // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); } - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail)); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail)); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail),emailLogRequest); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java new file mode 100644 index 00000000..8c8a0eaa --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -0,0 +1,79 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.entities.EmailTrackingEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.RecipientTypeEnum; +import net.gepafin.tendermanagement.enums.StatusTypeEnum; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; +import net.gepafin.tendermanagement.repositories.EmailLogRepository; +import net.gepafin.tendermanagement.repositories.EmailTrackingRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.FieldValidator; +import org.checkerframework.checker.units.qual.A; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class EmailLogDao { + + @Autowired + private EmailLogRepository emailLogRepository; + + @Autowired + private EmailTrackingRepository emailTrackingRepository; + + + public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest){ + EmailLogEntity emailLogEntity=new EmailLogEntity(); + emailLogEntity.setEmailType(emailLogRequest.getEmailType()); + emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue()); + emailLogEntity.setRecipientId(emailLogRequest.getRecipientId()); + emailLogEntity.setEmailSubject(emailLogRequest.getEmailSubject()); + emailLogEntity.setEmailBody(emailLogRequest.getEmailBody()); + emailLogEntity.setSendStatus(emailLogRequest.getSendStatus()); + emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); // Set to now if null + emailLogEntity.setErrorMessage(emailLogRequest.getErrorMessage()); + emailLogEntity=saveEmailLogEntity(emailLogEntity); + if(emailLogRequest.getEntityId()!=null && emailLogRequest.getEntityId()>0){ + EmailTrackingEntity emailTrackingEntity=createEmailTrackingEntity(emailLogEntity,emailLogRequest); + if(emailTrackingEntity==null){ + emailLogEntity.setErrorMessage("Failed while creating email tracking entity"); + emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue()); + emailLogEntity=saveEmailLogEntity(emailLogEntity); + } + } + return emailLogEntity; + } + public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){ + return emailLogRepository.save(emailLogEntity); + } + public EmailTrackingEntity createEmailTrackingEntity(EmailLogEntity emailLogEntity,EmailLogRequest emailLogRequest){ + EmailTrackingEntity emailTrackingEntity=new EmailTrackingEntity(); + emailTrackingEntity.setEmailLog(emailLogEntity); + emailTrackingEntity.setEntityId(emailLogRequest.getEntityId()); + emailTrackingEntity.setEntityType(emailLogRequest.getEntitytype().getValue()); + emailTrackingEntity.setUser(emailLogRequest.getUser()); + emailTrackingRepository.save(emailTrackingEntity); + return emailTrackingEntity; + } + public EmailLogRequest createEmailLogRequest(String emailType, RecipientTypeEnum recipientType, Long recipientId, + String emailSubject, String emailBody, String sendStatus, + String errorMessage, Long entityId, EmailTrackingEntityTypeEnum entityType, UserEntity user) { + EmailLogRequest emailLogRequest = new EmailLogRequest(); + emailLogRequest.setEmailType(emailType); + emailLogRequest.setRecipientType(recipientType); + emailLogRequest.setRecipientId(recipientId); + emailLogRequest.setEmailSubject(emailSubject); + emailLogRequest.setEmailBody(emailBody); + emailLogRequest.setSendStatus(sendStatus); + emailLogRequest.setErrorMessage(errorMessage); + emailLogRequest.setEntityId(entityId); + emailLogRequest.setEntitytype(entityType); + emailLogRequest.setUser(user); + 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 2f59aa0c..2e0b719d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -4,14 +4,16 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.HubEntity; -import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; -import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.RecipientTypeEnum; +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.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.EmailLogRepository; +import net.gepafin.tendermanagement.repositories.EmailTrackingRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.HubService; @@ -27,10 +29,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.LocalDateTime; +import java.util.*; @Component public class EmailNotificationDao { @@ -58,6 +58,15 @@ public class EmailNotificationDao { @Autowired HubRepository hubRepository; + @Autowired + private EmailLogDao emailLogDao; + + @Autowired + private EmailTrackingRepository emailTrackingRepository; + + @Autowired + private EmailLogRepository emailLogRepository; + private void sendEmail(ApplicationAmendmentRequestEntity amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, Map bodyPlaceholders, List additionalRecipients) { @@ -77,7 +86,9 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); - sendMail(applicationEntity.getHubId(), subject, body, recipientEmails); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(String.valueOf(templateType), RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, amendmentRequest.getId(), EmailTrackingEntityTypeEnum.AMENDMENT,userEntity); + + sendMail(applicationEntity.getHubId(), subject, body, recipientEmails,emailLogRequest); } private List getRecipientEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List additionalRecipients) { List recipientEmails = new ArrayList<>(); @@ -142,9 +153,20 @@ public class EmailNotificationDao { public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + UserEntity user = userService.validateUser(applicationEntity.getUserId()); Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(amendmentRequest.getCreatedDate(), GepafinConstant.DD_MM_YYYY_HH_MM)); + LocalDateTime lastReminderDateTime=amendmentRequest.getCreatedDate(); + List emailTrackingEntity=emailTrackingRepository.findFirstByEntityTypeAndEntityIdAndUser(EmailTrackingEntityTypeEnum.AMENDMENT.getValue(), amendmentRequest.getId(),user); + if(emailTrackingEntity != null && (!emailTrackingEntity.isEmpty())) { + EmailTrackingEntity emailTrackingEntity1=emailTrackingEntity.get(0); + List emailLogEntity = emailLogRepository.findByIdAndEmailTypeOrderByCreatedDateDesc(emailTrackingEntity1.getId(), SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST.getValue()); + if(emailLogEntity!=null && (!emailLogEntity.isEmpty())){ + EmailLogEntity emailLogEntity1=emailLogEntity.get(0); + lastReminderDateTime=emailLogEntity1.getSendDateTime(); + } + } + bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(lastReminderDateTime, GepafinConstant.DD_MM_YYYY)); sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null); } @@ -174,11 +196,11 @@ public class EmailNotificationDao { sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null); } - public void sendMail(Long hubId, String subject, String body, List recipientEmails) { + public void sendMail(Long hubId, String subject, String body, List recipientEmails, EmailLogRequest emailLogRequest) { EmailConfig emailConfig = retrieveEmailConfig(hubId); EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); - emailService.sendEmail(subject, body, recipientEmails, emailConfig); + emailService.sendEmail(subject, body, recipientEmails, emailConfig,emailLogRequest); } public EmailConfig retrieveEmailConfig(Long hubId) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java new file mode 100644 index 00000000..8dcaa76a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -0,0 +1,37 @@ +package net.gepafin.tendermanagement.entities; +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Entity +@Data +@Table(name = "email_log") +public class EmailLogEntity extends BaseEntity{ + + @Column(name = "email_type", nullable = false, length = 255) + private String emailType; + + @Column(name = "recipient_type", nullable = false, columnDefinition = "TEXT") + private String recipientType; + + @Column(name = "recipient_id", nullable = false) + private Long recipientId; + + @Column(name = "email_subject", columnDefinition = "TEXT") + private String emailSubject; + + @Column(name = "email_body", columnDefinition = "TEXT") + private String emailBody; + + @Column(name = "send_status", length = 255) + private String sendStatus; + + @Column(name = "send_date_time") + private LocalDateTime sendDateTime; + + @Column(name = "error_message", columnDefinition = "TEXT") + private String errorMessage; + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java new file mode 100644 index 00000000..57a25747 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.entities; +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Entity +@Data +@Table(name = "email_tracking") +public class EmailTrackingEntity extends BaseEntity{ + + + @ManyToOne + @JoinColumn(name = "email_log_id", nullable = false, foreignKey = @ForeignKey(name = "fk_email_log_id")) + private EmailLogEntity emailLog; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(name = "fk_user_id")) + private UserEntity user; + + @Column(name = "entity_id", nullable = false) + private Long entityId; + + @Column(name = "entity_type", nullable = false, length = 255) + private String entityType; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java new file mode 100644 index 00000000..a2a356db --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum EmailTrackingEntityTypeEnum { + + AMENDMENT("AMENDMENT"), + APPLICATION("APPLICATION"); + + private String value; + + EmailTrackingEntityTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java new file mode 100644 index 00000000..e08a3e6b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum RecipientTypeEnum { + + BENEFICIARY ("BENEFICIARY"), + USER("USER"), + COMPANY("COMPANY"); + + private String value; + + RecipientTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/StatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/StatusTypeEnum.java new file mode 100644 index 00000000..dc7c11d5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/StatusTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum StatusTypeEnum { + + SUCCESS ("SUCCESS"), + FAILED("FAILED"); + + private String value; + + StatusTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return 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 new file mode 100644 index 00000000..e15c6783 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java @@ -0,0 +1,31 @@ +package net.gepafin.tendermanagement.model.request; + +import jakarta.persistence.Column; +import lombok.Data; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.RecipientTypeEnum; + +@Data +public class EmailLogRequest { + + private String emailType; + + private RecipientTypeEnum recipientType; + + private Long recipientId; + + private String emailSubject; + + private String emailBody; + + private String sendStatus; + + private String errorMessage; + + private Long entityId; + + private EmailTrackingEntityTypeEnum entitytype; + + private UserEntity user; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailTrackingRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailTrackingRequest.java new file mode 100644 index 00000000..558271fe --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailTrackingRequest.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.entities.EmailLogEntity; + +@Data +public class EmailTrackingRequest { + + private EmailLogEntity emailLogEntity; + + private Long userId; + + private Long entityId; + + private String entityType; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java new file mode 100644 index 00000000..998050ec --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.EmailLogEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface EmailLogRepository extends JpaRepository { + + List findByIdAndEmailTypeOrderByCreatedDateDesc(Long id, String emailType); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java new file mode 100644 index 00000000..e89ec2c6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.EmailTrackingEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface EmailTrackingRepository extends JpaRepository { + + List findFirstByEntityTypeAndEntityIdAndUser( + String entityType, Long entityId, UserEntity user + ); +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 93d41c98..24e34282 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -41,8 +41,8 @@ public class NotificationScheduler { ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); if (amendmentRequest != null) { - LocalDateTime requestDate = amendmentRequest.getCreatedDate(); - if (requestDate.plusDays(amendmentRequest.getResponseDays()).isAfter(today)) { + LocalDateTime requestDate = amendmentRequest.getStartDate(); + if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) { // Update the application status to REJECTED application.setStatus("REJECTED"); applicationRepository.save(application); @@ -56,6 +56,6 @@ public class NotificationScheduler { private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { - return amendmentRequestList.stream().filter(request -> request.getId().equals(application.getId())).findFirst().orElse(null); + return amendmentRequestList.stream().filter(request -> request.getApplicationId().equals(application.getId())).findFirst().orElse(null); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java index 6b7b91cc..395456e8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java @@ -1,11 +1,12 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.model.request.EmailConfig; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; import java.util.List; public interface EmailService { - void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig); + void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java index 9dd965e7..76fee2ed 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -1,6 +1,10 @@ package net.gepafin.tendermanagement.service.impl; +import net.gepafin.tendermanagement.dao.EmailLogDao; +import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.model.request.EmailConfig; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.service.feignClient.MailgunFeignClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -15,8 +19,11 @@ public class MailgunEmailService implements EmailService { @Autowired private MailgunFeignClient mailgunFeignClient; + @Autowired + private EmailLogDao emailLogDao; + @Override - public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) { String domain = emailConfig.getDomain(); String from = emailConfig.getSender(); String apiKey = emailConfig.getApiKey(); @@ -25,8 +32,13 @@ public class MailgunEmailService implements EmailService { // Send email via Mailgun API ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); if (!response.getStatusCode().is2xxSuccessful()) { + emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); + emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); } + EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); + } } 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 f2cdc613..5aa4da50 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -1,7 +1,11 @@ package net.gepafin.tendermanagement.service.impl; import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.dao.EmailLogDao; +import net.gepafin.tendermanagement.entities.EmailLogEntity; +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.PecEmailRequest; import net.gepafin.tendermanagement.service.feignClient.PecFeignClient; import org.springframework.beans.factory.annotation.Autowired; @@ -20,8 +24,11 @@ public class PecEmailService implements EmailService { this.pecFeignClient = pecFeignClient; } + @Autowired + private EmailLogDao emailLogDao; + @Override - public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) { PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); emailRequest.setRecipient(recipientEmails); @@ -34,8 +41,12 @@ public class PecEmailService implements EmailService { ResponseEntity response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest); log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody()); if (!response.getStatusCode().is2xxSuccessful()) { + emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); + emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); } + EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); } } 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 9aa2ec42..8a06b83e 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 @@ -1720,4 +1720,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +