From 50c1f0b80043656feca523bf663fb6526c5ba5e6 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 12 Nov 2024 18:11:15 +0530 Subject: [PATCH 01/27] Done ticket --- .../dao/ApplicationAmendmentRequestDao.java | 11 +-- .../tendermanagement/dao/ApplicationDao.java | 25 +++--- .../tendermanagement/dao/EmailLogDao.java | 79 +++++++++++++++++++ .../dao/EmailNotificationDao.java | 48 ++++++++--- .../entities/EmailLogEntity.java | 37 +++++++++ .../entities/EmailTrackingEntity.java | 27 +++++++ .../enums/EmailTrackingEntityTypeEnum.java | 20 +++++ .../enums/RecipientTypeEnum.java | 21 +++++ .../enums/StatusTypeEnum.java | 20 +++++ .../model/request/EmailLogRequest.java | 31 ++++++++ .../model/request/EmailTrackingRequest.java | 16 ++++ .../repositories/EmailLogRepository.java | 11 +++ .../repositories/EmailTrackingRepository.java | 16 ++++ .../scheduler/NotificationScheduler.java | 6 +- .../service/impl/EmailService.java | 3 +- .../service/impl/MailgunEmailService.java | 14 +++- .../service/impl/PecEmailService.java | 13 ++- .../db/changelog/db.changelog-1.0.0.xml | 49 ++++++++++++ 18 files changed, 411 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/StatusTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EmailTrackingRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 526a8313577317514cced265ee51b62eaeb9ad7b Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 13 Nov 2024 12:53:29 +0530 Subject: [PATCH 02/27] Updated code --- .../tendermanagement/scheduler/NotificationScheduler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 24e34282..58908280 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -4,6 +4,8 @@ import net.gepafin.tendermanagement.dao.EmailNotificationDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.UserRepository; @@ -44,9 +46,9 @@ public class NotificationScheduler { LocalDateTime requestDate = amendmentRequest.getStartDate(); if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) { // Update the application status to REJECTED - application.setStatus("REJECTED"); + application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue()); applicationRepository.save(application); - amendmentRequest.setStatus("CLOSE"); + amendmentRequest.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); applicationAmendmentRepository.save(amendmentRequest); emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); } From 7485cead14c2f221c383cd33913aad31dbe1743b Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 15 Nov 2024 19:55:24 +0530 Subject: [PATCH 03/27] Done ticket GEPAFINBE-92 --- pom.xml | 7 +++ .../dao/ApplicationAmendmentRequestDao.java | 2 +- .../tendermanagement/dao/ApplicationDao.java | 16 +++++-- .../tendermanagement/dao/EmailLogDao.java | 43 ++++++------------- .../dao/EmailNotificationDao.java | 15 ++----- .../dao/SystemEmailTemplatesDao.java | 2 + .../entities/EmailLogEntity.java | 17 ++++++++ .../entities/EmailTrackingEntity.java | 27 ------------ .../entities/SystemEmailTemplatesEntity.java | 3 ++ ...TypeEnum.java => EmailEntityTypeEnum.java} | 4 +- .../enums/EmailScenarioTypeEnum.java | 24 +++++++++++ .../enums/EmailServiceTypeEnum.java | 20 +++++++++ .../enums/RecipientTypeEnum.java | 3 +- .../model/request/EmailConfig.java | 1 + .../model/request/EmailLogRequest.java | 19 +++++--- .../response/SystemEmailTemplateResponse.java | 3 ++ .../repositories/EmailLogRepository.java | 2 +- .../repositories/EmailTrackingRepository.java | 16 ------- .../feignClient/MailgunFeignClient.java | 42 ++++++++++++------ .../service/feignClient/PecFeignClient.java | 9 ++-- .../service/impl/MailgunEmailService.java | 34 +++++++++++---- .../service/impl/PecEmailService.java | 40 +++++++++++------ .../gepafin/tendermanagement/util/Utils.java | 5 +++ .../db/changelog/db.changelog-1.0.0.xml | 41 +++++++----------- ...ta_for_email_service_config_15-11-2024.sql | 9 ++++ ...template_for_email_scenario_15-11-2024.sql | 17 ++++++++ 26 files changed, 257 insertions(+), 164 deletions(-) delete mode 100644 src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java rename src/main/java/net/gepafin/tendermanagement/enums/{EmailTrackingEntityTypeEnum.java => EmailEntityTypeEnum.java} (76%) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java create mode 100644 src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql create mode 100644 src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql diff --git a/pom.xml b/pom.xml index b443ec18..08c677d0 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,13 @@ lombok + + + com.mashape.unirest + unirest-java + 1.4.9 + + com.h2database diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index dc3049a6..c3fbc94c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -595,7 +595,7 @@ public class ApplicationAmendmentRequestDao { String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER.getValue(),RecipientTypeEnum.BENEFICIARY,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(),EmailTrackingEntityTypeEnum.AMENDMENT,beneficiaryUser); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(),RecipientTypeEnum.USER,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(), EmailEntityTypeEnum.AMENDMENT,beneficiaryUser.getEmail(),beneficiaryUser.getId()); 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 27dd5485..53b3128e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -791,12 +791,13 @@ public class ApplicationDao { // Replace placeholders in the subject and body String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.USER,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); String email = userEntity.getEmail(); if (userEntity.getBeneficiary() != null) { + emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); email = userEntity.getBeneficiary().getEmail(); + emailLogRequest.setUserId(userEntity.getBeneficiary().getId()); } - 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); @@ -810,6 +811,11 @@ public class ApplicationDao { if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { recipientEmails.add(contactEmail); } + if(Boolean.FALSE.equals(recipientEmails.isEmpty())){ + emailLogRequest.setRecipientId(applicationEntity.getCompany().getId()); + emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY); + emailLogRequest.setRecipientEmails(companyEmail); + } emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest); } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { @@ -837,17 +843,21 @@ 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); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,subject,body,StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); // 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()) { + emailLogRequest.setRecipientEmails(carloEmail); // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); } + emailLogRequest.setRecipientEmails(gepafinEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail),emailLogRequest); + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); + emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java index 8c8a0eaa..8b6a8ea3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -1,17 +1,12 @@ 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.EmailScenarioTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; 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; @@ -23,13 +18,10 @@ 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.setEmailType(emailLogRequest.getEmailType().getValue()); emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue()); emailLogEntity.setRecipientId(emailLogRequest.getRecipientId()); emailLogEntity.setEmailSubject(emailLogRequest.getEmailSubject()); @@ -37,32 +29,22 @@ public class EmailLogDao { emailLogEntity.setSendStatus(emailLogRequest.getSendStatus()); emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); // Set to now if null emailLogEntity.setErrorMessage(emailLogRequest.getErrorMessage()); - emailLogEntity=saveEmailLogEntity(emailLogEntity); + emailLogEntity.setUserId(emailLogRequest.getUserId()); + emailLogEntity.setEmailServiceResponse(emailLogRequest.getEmailServiceResponse()); + emailLogEntity.setRecipientEmails(emailLogRequest.getRecipientEmails()); 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); - } + emailLogEntity.setEntityId(emailLogRequest.getEntityId()); + emailLogEntity.setEntityType(emailLogRequest.getEntitytype().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, + public EmailLogRequest createEmailLogRequest(EmailScenarioTypeEnum emailType, RecipientTypeEnum recipientType, Long recipientId, String emailSubject, String emailBody, String sendStatus, - String errorMessage, Long entityId, EmailTrackingEntityTypeEnum entityType, UserEntity user) { + String errorMessage, Long entityId, EmailEntityTypeEnum entityType, String recipientEmails, Long userId) { EmailLogRequest emailLogRequest = new EmailLogRequest(); emailLogRequest.setEmailType(emailType); emailLogRequest.setRecipientType(recipientType); @@ -71,9 +53,10 @@ public class EmailLogDao { emailLogRequest.setEmailBody(emailBody); emailLogRequest.setSendStatus(sendStatus); emailLogRequest.setErrorMessage(errorMessage); + emailLogRequest.setUserId(userId); emailLogRequest.setEntityId(entityId); emailLogRequest.setEntitytype(entityType); - emailLogRequest.setUser(user); + emailLogRequest.setRecipientEmails(recipientEmails); 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 c88cee97..46833b42 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -5,15 +5,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.EmailTrackingEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; 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; @@ -57,9 +55,6 @@ public class EmailNotificationDao { @Autowired private EmailLogDao emailLogDao; - @Autowired - private EmailTrackingRepository emailTrackingRepository; - @Autowired private EmailLogRepository emailLogRepository; @@ -82,7 +77,7 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(String.valueOf(templateType), RecipientTypeEnum.BENEFICIARY,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, amendmentRequest.getId(), EmailTrackingEntityTypeEnum.AMENDMENT,userEntity); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, amendmentRequest.getId(), EmailEntityTypeEnum.AMENDMENT,Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId()); sendMail(applicationEntity.getHubId(), subject, body, recipientEmails,emailLogRequest); } @@ -153,14 +148,10 @@ public class EmailNotificationDao { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); 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()); + List emailLogEntity = emailLogRepository.findByUserIdAndEntityIdAndEntityType(user.getId(),amendmentRequest.getId(),EmailEntityTypeEnum.AMENDMENT.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)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java index 1665a724..514506f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -78,6 +79,7 @@ public class SystemEmailTemplatesDao { systemEmailTemplateResponse.setHtmlContent(htmlContent); systemEmailTemplateResponse.setSubject(subject); systemEmailTemplateResponse.setJsonMap(languageMap); + systemEmailTemplateResponse.setEmailScenario(EmailScenarioTypeEnum.valueOf(dbSystemEmailTemplatesEntity.getEmailScenario())); return systemEmailTemplateResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 8dcaa76a..848e895b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -33,5 +33,22 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "error_message", columnDefinition = "TEXT") private String errorMessage; + @Column(name = "email_service_response") + private String emailServiceResponse; + + @Column(name = "email_service_type") + private String emailServiceType; + + @Column(name = "recipient_emails") + private String recipientEmails; + + @Column(name = "user_id") + private Long userId; + + @Column(name = "entity_id") + private Long entityId; + + @Column(name = "entity_type") + private String entityType; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java deleted file mode 100644 index 57a25747..00000000 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailTrackingEntity.java +++ /dev/null @@ -1,27 +0,0 @@ -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/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 1440e00d..f7974eca 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -35,6 +35,9 @@ public class SystemEmailTemplatesEntity extends BaseEntity { @Column(name ="IS_DELETED", nullable = false) private Boolean isDeleted = false; + + @Column(name = "email_scenario") + private String emailScenario; public enum SystemEmailTemplatesEntityTypeEnum { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java similarity index 76% rename from src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java rename to src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java index a2a356db..6abea8ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailTrackingEntityTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailEntityTypeEnum.java @@ -2,14 +2,14 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum EmailTrackingEntityTypeEnum { +public enum EmailEntityTypeEnum { AMENDMENT("AMENDMENT"), APPLICATION("APPLICATION"); private String value; - EmailTrackingEntityTypeEnum(String value) { + EmailEntityTypeEnum(String value) { this.value = value; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java new file mode 100644 index 00000000..493f987c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum EmailScenarioTypeEnum { + + APPLICATION_SUBMITTED("APPLICATION_SUBMITTED"), + APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"), + APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"), + APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"), + APPLICATION_APPROVED("APPLICATION_APPROVED"), + APPLICATION_REJECTED("APPLICATION_REJECTED"); + + private final String value; + + EmailScenarioTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java new file mode 100644 index 00000000..8a22c69c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum EmailServiceTypeEnum { + + MAILGUN("MAILGUN"), + PEC("PEC"); + + private String value; + + EmailServiceTypeEnum(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 index e08a3e6b..c4f54175 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/RecipientTypeEnum.java @@ -6,7 +6,8 @@ public enum RecipientTypeEnum { BENEFICIARY ("BENEFICIARY"), USER("USER"), - COMPANY("COMPANY"); + COMPANY("COMPANY"), + PROPERTIES("PROPERTIES"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java index 5a94b325..79f4c966 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java @@ -13,6 +13,7 @@ public class EmailConfig { private String domain; private String mailgunApiUrl; private String pecApiUrl; + private String url; } 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 e15c6783..b6e8c07b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java @@ -1,15 +1,15 @@ 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.EmailScenarioTypeEnum; +import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; @Data public class EmailLogRequest { - private String emailType; + private EmailScenarioTypeEnum emailType; private RecipientTypeEnum recipientType; @@ -25,7 +25,14 @@ public class EmailLogRequest { private Long entityId; - private EmailTrackingEntityTypeEnum entitytype; + private EmailEntityTypeEnum entitytype; + + private Long userId; + + private String emailServiceResponse; + + private EmailServiceTypeEnum emailServiceType; + + private String recipientEmails; - private UserEntity user; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java index cd65e6e4..0752afb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SystemEmailTemplateResponse.java @@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.model.response; import java.util.Map; import lombok.Data; +import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; @Data public class SystemEmailTemplateResponse { + EmailScenarioTypeEnum emailScenario; + String htmlContent; String subject; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java index 998050ec..ec181249 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -7,5 +7,5 @@ import java.util.List; public interface EmailLogRepository extends JpaRepository { - List findByIdAndEmailTypeOrderByCreatedDateDesc(Long id, String emailType); + List findByUserIdAndEntityIdAndEntityType(Long userId,Long entityId,String entityType); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java deleted file mode 100644 index e89ec2c6..00000000 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailTrackingRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -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/service/feignClient/MailgunFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java index eb9c50d1..3006ef51 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java @@ -1,24 +1,40 @@ package net.gepafin.tendermanagement.service.feignClient; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; -@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") +//@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") public interface MailgunFeignClient { - @PostMapping("/v3/{domain}/messages") - ResponseEntity sendEmail( - @PathVariable("domain") String domain, - @RequestParam("from") String from, - @RequestParam("to") List to, - @RequestParam("subject") String subject, - @RequestParam("html") String htmlBody, - @RequestHeader("Authorization") String authorizationHeader); +// @PostMapping(value = "/v3/{domain}/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) +// ResponseEntity sendEmail( @RequestPart("from") String from, +// @RequestPart("to") List to, +// @RequestPart("subject") String subject, +// @RequestPart("text") String htmlBody, +// @PathVariable("domain") String domain, +//// @RequestBody PayloadDTO dto, +// //RequestParam +// +// @RequestHeader HttpHeaders headers); +// +// public class PayloadDTO { +// public String from; +// public List to; +// public String subject; +// public String htmlBody; +// +// public PayloadDTO(String from, List to, String subject, String htmlBody) { +// this.from = from; +// this.to = to; +// this.subject = subject; +// this.htmlBody = htmlBody; +// } +// +// } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java index d251e644..f6fe99f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java @@ -3,15 +3,16 @@ package net.gepafin.tendermanagement.service.feignClient; import feign.Headers; import net.gepafin.tendermanagement.model.request.PecEmailRequest; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; -@FeignClient(name = "pecClient", url = "${api.pecUrl}") +//@FeignClient(name = "pecClient", url = "${api.pecUrl}") public interface PecFeignClient { - @PostMapping("/send") - ResponseEntity sendEmail(@RequestHeader("Authorization") String token, - @RequestBody PecEmailRequest emailRequest); +// @PostMapping("/send") +// ResponseEntity sendEmail(@RequestHeader HttpHeaders headers, +// @RequestBody PecEmailRequest emailRequest); } 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 e27a231a..97c75667 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -1,16 +1,20 @@ package net.gepafin.tendermanagement.service.impl; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.Unirest; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; 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 net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.util.Base64; @@ -18,9 +22,6 @@ import java.util.List; @Service public class MailgunEmailService implements EmailService { - - @Autowired - private MailgunFeignClient mailgunFeignClient; @Value("${isMailSendingEnabled}") private String isEmailSendingEnabled; @@ -38,21 +39,36 @@ public class MailgunEmailService implements EmailService { return; } - String domain = emailConfig.getDomain(); + String url = emailConfig.getUrl(); String from = emailConfig.getSender(); String apiKey = emailConfig.getApiKey(); String authHeader = "Basic " + Base64.getEncoder().encodeToString(("api:" + apiKey).getBytes()); // Send email via Mailgun API + HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { - ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); - if (!response.getStatusCode().is2xxSuccessful()) { + + emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); + try { + Unirest.setTimeouts(0, 0); + response2 = Unirest.post(url) + .header("Authorization", authHeader) +// .header("content-type", "multipart/form-data") + .field("from", from) + .field("to", recipientEmails) + .field("subject", subject) + .field("html", body) + .asString(); + }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); + emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); - throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); + throw new RuntimeException("Failed to send email via Mailgun: " + response2.getStatus()); } + emailLogRequest.setEmailServiceResponse(response2.getBody()); } + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); 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 e9500d4b..8d6667d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -1,17 +1,25 @@ package net.gepafin.tendermanagement.service.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +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.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; +import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; 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 net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -20,12 +28,6 @@ import java.util.List; @Slf4j @Service public class PecEmailService implements EmailService { - private final PecFeignClient pecFeignClient; - - public PecEmailService(PecFeignClient pecFeignClient) { - - this.pecFeignClient = pecFeignClient; - } @Value("${isMailSendingEnabled}") private String isEmailSendingEnabled; @@ -45,23 +47,33 @@ public class PecEmailService implements EmailService { PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); - emailRequest.setRecipient(recipientEmails); + emailRequest.setSubject(subject); emailRequest.setBody(body); emailRequest.setUsername(emailConfig.getUsername()); emailRequest.setPassword(emailConfig.getPassword()); - + String url=emailConfig.getUrl(); String authToken = emailConfig.getAuthToken(); + HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { - 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.setRecipientEmails(Utils.listToCommaSeparatedString(emailRequest.getRecipient())); + try { + Unirest.setTimeouts(0, 0); + response2 = Unirest.post(url) + .header("Authorization", "Bearer " + authToken) + .header("Content-Type", "application/json") + .body(Utils.convertObjectToJson(emailRequest)) // Serialize the emailRequest object to JSON + .asString(); + }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setErrorMessage(String.valueOf(response.getStatusCode())); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); + emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); - throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); - } + throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus()); + } + emailLogRequest.setEmailServiceResponse(response2.getBody()); } + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 26f049ef..ebd5eea3 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -24,6 +24,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import com.fasterxml.jackson.core.JsonProcessingException; @@ -40,6 +41,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenExce import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; +import org.springframework.http.MediaType; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -515,4 +517,7 @@ public class Utils { } return null; } + public static String listToCommaSeparatedString(List list) { + return String.join(", ", list.stream().map(String::valueOf).toList()); + } } 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 8a06b83e..a794719f 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,7 +1720,7 @@ - + - @@ -1741,32 +1740,24 @@ + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - diff --git a/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql new file mode 100644 index 00000000..40b6a790 --- /dev/null +++ b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql @@ -0,0 +1,9 @@ +UPDATE hub +SET email_service_type = 'PEC_SERVICE', + email_service_config = 'JkFbBfuVvq7VWwp5LcWIi+hAa1RJ1ekI0jq3w7gLTXETZiTaN8zC4OBWD53x8FtbfFTh3L/5805CIYTH1BQGa3X9q16q9SDzMy7DKHdmJzOnLKhn74C5akoXKaeXUCGnzp0cSk2c01FV6lwefC29IshijFSumCHtVlgWNeZigBzmWK+M7NS+EXf4goIMzguL5bHpYXfoQunQozeY1SpOo+28gDDpzZRMXdtcwKkTgESFGwsy6S1m1TBxJwZC7p8W' +WHERE UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs'; + +UPDATE hub +SET email_service_type = 'MAILGUN_SERVICE', + email_service_config = 'QlICHJMvBHd09ci/B2+EDR0q6kFsEdu5gOSI1hgG/7SAm2wXQZagDsAbkBrA6JPHXUS3Bkw6UD9x5boYYxBi3tnpu16i0NgdZqcc2BBhMF1VgRlJMgX+KgsOJsnQbHAJ/9YZaeIVrJpxceHFx93NTbfjT3TzzaZ9cW/64wbeZFspEp6WwgKgV1/3+j297Q1QtKIiWKanolYaU9myx9KwPJZc8AmPe0PR2ViyA7VyGn6iQSrX2pr15tBw3xVIm0tfHh6pktHro4gRYs5CEypQ2cSbP5wv4Z6pDa//FHXzYpRvnb1AUh0thGOix5FZl9Kn' +WHERE UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE'; \ No newline at end of file diff --git a/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql b/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql new file mode 100644 index 00000000..bf70f8aa --- /dev/null +++ b/src/main/resources/db/dump/updated_system_email_template_for_email_scenario_15-11-2024.sql @@ -0,0 +1,17 @@ +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_SUBMITTED' WHERE "type"='APPLICATION_SUBMISSION_TO_USER_AND_COMPANY' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_SUBMITTED' WHERE "type"='APPLICATION_SUBMISSION_TO_GEPAFIN' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_REMINDER' WHERE "type"='AMENDMENT_REMINDER' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_EXPIRED' WHERE "type"='INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_APPROVED' WHERE "type"='ADMISSIBILITY_NOTIFICATION' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_REJECTED' WHERE "type"='INADMISSIBILITY_NOTIFICATION' AND "system"=true ; + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_AMENDMENT_REQUESTED' WHERE "type"='DOCUMENTATION_INTEGRATION_REQUEST' AND "system"=true ; + + + + From 3d92173fe78f77b668700b6595099953589bedbd Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 15 Nov 2024 20:16:30 +0530 Subject: [PATCH 04/27] Updated code --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 6556e2fd..4023ec93 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -132,7 +132,6 @@ public class ApplicationDao { @Autowired private FormDao formDao; - @Autowired private EmailLogDao emailLogDao; @@ -850,8 +849,8 @@ public class ApplicationDao { // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); } - emailLogRequest.setRecipientEmails(gepafinEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail),emailLogRequest); + emailLogRequest.setRecipientEmails(hub.getEmail()); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); From c29935c66f83477b87b6231264c522f42b7c1435 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 18 Nov 2024 11:46:09 +0530 Subject: [PATCH 05/27] Updated code --- .../dao/EmailNotificationDao.java | 17 ++++---- .../enums/EmailServiceTypeEnum.java | 4 +- .../feignClient/MailgunFeignClient.java | 40 ------------------- .../service/feignClient/PecFeignClient.java | 18 --------- .../service/impl/MailgunEmailService.java | 6 +-- .../service/impl/PecEmailService.java | 12 ++---- .../db/changelog/db.changelog-1.0.0.xml | 9 ++++- 7 files changed, 24 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 0ee43c27..02eea873 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -61,7 +61,7 @@ public class EmailNotificationDao { private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, - Map bodyPlaceholders, List additionalRecipients) { + Map bodyPlaceholders, List additionalRecipients,Boolean isAmendment,Long amendmentId) { HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); String service = determineService(applicationEntity.getHubId()); @@ -77,8 +77,11 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, applicationEntity.getId(), EmailEntityTypeEnum.AMENDMENT,Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId()); - + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId()); + if(Boolean.TRUE.equals(isAmendment) && amendmentId !=null){ + emailLogRequest.setEntitytype(EmailEntityTypeEnum.AMENDMENT); + emailLogRequest.setEntityId(amendmentId); + } sendMail(applicationEntity.getHubId(), subject, body, recipientEmails,emailLogRequest); } private List getRecipientEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List additionalRecipients) { @@ -138,7 +141,7 @@ public class EmailNotificationDao { log.error("Failed to parse form fields JSON: ", e); } bodyPlaceholders.put("{{note}}", applicationAmendmentRequest.getNote()); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null,true,applicationAmendmentRequest.getId()); } public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { @@ -155,7 +158,7 @@ public class EmailNotificationDao { } bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(lastReminderDateTime, GepafinConstant.DD_MM_YYYY)); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,true,amendmentRequest.getId()); } public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { @@ -165,7 +168,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,false,null); } public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { @@ -176,7 +179,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getNote()); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,false,null); } public void sendMail(Long hubId, String subject, String body, List recipientEmails, EmailLogRequest emailLogRequest) { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java index 8a22c69c..49c14743 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailServiceTypeEnum.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum EmailServiceTypeEnum { - MAILGUN("MAILGUN"), - PEC("PEC"); + MAILGUN_SERVICE("MAILGUN_SERVICE"), + PEC_SERVICE("PEC_SERVICE"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java deleted file mode 100644 index 3006ef51..00000000 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.gepafin.tendermanagement.service.feignClient; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -//@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") -public interface MailgunFeignClient { -// @PostMapping(value = "/v3/{domain}/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) -// ResponseEntity sendEmail( @RequestPart("from") String from, -// @RequestPart("to") List to, -// @RequestPart("subject") String subject, -// @RequestPart("text") String htmlBody, -// @PathVariable("domain") String domain, -//// @RequestBody PayloadDTO dto, -// //RequestParam -// -// @RequestHeader HttpHeaders headers); -// -// public class PayloadDTO { -// public String from; -// public List to; -// public String subject; -// public String htmlBody; -// -// public PayloadDTO(String from, List to, String subject, String htmlBody) { -// this.from = from; -// this.to = to; -// this.subject = subject; -// this.htmlBody = htmlBody; -// } -// -// } -} - - diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java deleted file mode 100644 index f6fe99f6..00000000 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.gepafin.tendermanagement.service.feignClient; - -import feign.Headers; -import net.gepafin.tendermanagement.model.request.PecEmailRequest; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; - -//@FeignClient(name = "pecClient", url = "${api.pecUrl}") -public interface PecFeignClient { -// @PostMapping("/send") -// ResponseEntity sendEmail(@RequestHeader HttpHeaders headers, -// @RequestBody PecEmailRequest emailRequest); -} - 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 97c75667..3bf2ecd8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -2,14 +2,12 @@ package net.gepafin.tendermanagement.service.impl; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; -import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; 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 net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; @@ -61,14 +59,14 @@ public class MailgunEmailService implements EmailService { .asString(); }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE); emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); throw new RuntimeException("Failed to send email via Mailgun: " + response2.getStatus()); } emailLogRequest.setEmailServiceResponse(response2.getBody()); } - emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE); 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 8d6667d5..81991f69 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -1,11 +1,8 @@ package net.gepafin.tendermanagement.service.impl; -import com.fasterxml.jackson.core.JsonProcessingException; -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.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; @@ -13,14 +10,11 @@ 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 net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.util.List; @@ -47,11 +41,11 @@ public class PecEmailService implements EmailService { PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); - emailRequest.setSubject(subject); emailRequest.setBody(body); emailRequest.setUsername(emailConfig.getUsername()); emailRequest.setPassword(emailConfig.getPassword()); + emailRequest.setRecipient(recipientEmails); String url=emailConfig.getUrl(); String authToken = emailConfig.getAuthToken(); HttpResponse response2=null; @@ -66,14 +60,14 @@ public class PecEmailService implements EmailService { .asString(); }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); - emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); emailLogRequest.setErrorMessage(e.getMessage()); EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus()); } emailLogRequest.setEmailServiceResponse(response2.getBody()); } - emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC); + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); 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 c3345556..58641af4 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 @@ -1759,12 +1759,11 @@ path="db/dump/updated_hub_data_for_email_service_config_15-11-2024.sql"/> - - + @@ -1772,4 +1771,10 @@ + + + + + + From dac9610b0f99e10c6ae2cf7e60588f0e4aec1e73 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 18 Nov 2024 12:25:13 +0530 Subject: [PATCH 06/27] Updated code --- .../java/net/gepafin/tendermanagement/dao/EmailLogDao.java | 2 ++ .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 +- .../net/gepafin/tendermanagement/entities/EmailLogEntity.java | 3 +++ .../tendermanagement/repositories/EmailLogRepository.java | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java index 8b6a8ea3..297e94d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -32,6 +32,8 @@ public class EmailLogDao { emailLogEntity.setUserId(emailLogRequest.getUserId()); emailLogEntity.setEmailServiceResponse(emailLogRequest.getEmailServiceResponse()); emailLogEntity.setRecipientEmails(emailLogRequest.getRecipientEmails()); + emailLogEntity.setEmailServiceType(emailLogRequest.getEmailServiceType().getValue()); + emailLogEntity.setIsDeleted(false); if(emailLogRequest.getEntityId()!=null && emailLogRequest.getEntityId()>0){ emailLogEntity.setEntityId(emailLogRequest.getEntityId()); emailLogEntity.setEntityType(emailLogRequest.getEntitytype().getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 02eea873..5c06a906 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -151,7 +151,7 @@ public class EmailNotificationDao { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); LocalDateTime lastReminderDateTime=amendmentRequest.getCreatedDate(); - List emailLogEntity = emailLogRepository.findByUserIdAndEntityIdAndEntityType(user.getId(),amendmentRequest.getId(),EmailEntityTypeEnum.AMENDMENT.getValue()); + List emailLogEntity = emailLogRepository.findByUserIdAndEntityIdAndEntityTypeAndIsDeletedFalse(user.getId(),amendmentRequest.getId(),EmailEntityTypeEnum.AMENDMENT.getValue()); if(emailLogEntity!=null && (!emailLogEntity.isEmpty())){ EmailLogEntity emailLogEntity1=emailLogEntity.get(0); lastReminderDateTime=emailLogEntity1.getSendDateTime(); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 848e895b..8c2729a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -50,5 +50,8 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "entity_type") private String entityType; + + @Column(name = "is_deleted") + private Boolean isDeleted; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java index ec181249..8cc9b470 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -7,5 +7,5 @@ import java.util.List; public interface EmailLogRepository extends JpaRepository { - List findByUserIdAndEntityIdAndEntityType(Long userId,Long entityId,String entityType); + List findByUserIdAndEntityIdAndEntityTypeAndIsDeletedFalse(Long userId,Long entityId,String entityType); } From 0342d1b2eb767a29b90696aec808457f2d625058 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 18 Nov 2024 16:49:01 +0530 Subject: [PATCH 07/27] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 2 +- .../tendermanagement/dao/ApplicationDao.java | 6 +++--- .../tendermanagement/dao/EmailLogDao.java | 19 +++++++------------ .../dao/EmailNotificationDao.java | 18 +++++++----------- .../entities/EmailLogEntity.java | 11 +++++++---- .../model/request/EmailLogRequest.java | 10 ++++++---- .../repositories/EmailLogRepository.java | 2 +- .../service/impl/MailgunEmailService.java | 4 +++- .../service/impl/PecEmailService.java | 3 +++ .../db/changelog/db.changelog-1.0.0.xml | 8 ++++++++ 10 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 6cbd132f..a4da3b00 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -733,7 +733,7 @@ public class ApplicationAmendmentRequestDao { String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(),RecipientTypeEnum.USER,beneficiaryUser.getId(),subject,body,StatusTypeEnum.SUCCESS.getValue(), null,amendment.getId(), EmailEntityTypeEnum.AMENDMENT,beneficiaryUser.getEmail(),beneficiaryUser.getId()); + 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); } 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 4023ec93..81165ca4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -787,8 +787,8 @@ public class ApplicationDao { // Replace placeholders in the subject and body String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.USER,userEntity.getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); - String email = userEntity.getEmail(); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.USER,userEntity.getId(),userEntity.getEmail(),userEntity.getId(),applicationEntity.getId(),null,applicationEntity.getCall().getId()); + String email = userEntity.getEmail(); if (userEntity.getBeneficiary() != null) { emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); email = userEntity.getBeneficiary().getEmail(); @@ -839,7 +839,7 @@ public class ApplicationDao { String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,subject,body,StatusTypeEnum.SUCCESS.getValue(), null,applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,userEntity.getEmail(),userEntity.getId()); + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(),RecipientTypeEnum.PROPERTIES,null,userEntity.getEmail(),userEntity.getId(),applicationEntity.getId(),null,applicationEntity.getCall().getId()); // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java index 297e94d0..5775daf1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java @@ -34,10 +34,9 @@ public class EmailLogDao { emailLogEntity.setRecipientEmails(emailLogRequest.getRecipientEmails()); emailLogEntity.setEmailServiceType(emailLogRequest.getEmailServiceType().getValue()); emailLogEntity.setIsDeleted(false); - if(emailLogRequest.getEntityId()!=null && emailLogRequest.getEntityId()>0){ - emailLogEntity.setEntityId(emailLogRequest.getEntityId()); - emailLogEntity.setEntityType(emailLogRequest.getEntitytype().getValue()); - } + emailLogEntity.setApplicationId(emailLogRequest.getApplicatioId()); + emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId()); + emailLogEntity.setCallId(emailLogRequest.getCallId()); emailLogEntity=saveEmailLogEntity(emailLogEntity); return emailLogEntity; } @@ -45,20 +44,16 @@ public class EmailLogDao { return emailLogRepository.save(emailLogEntity); } public EmailLogRequest createEmailLogRequest(EmailScenarioTypeEnum emailType, RecipientTypeEnum recipientType, Long recipientId, - String emailSubject, String emailBody, String sendStatus, - String errorMessage, Long entityId, EmailEntityTypeEnum entityType, String recipientEmails, Long userId) { + String recipientEmails, Long userId,Long applicationId,Long amendmentId,Long callId) { 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.setUserId(userId); - emailLogRequest.setEntityId(entityId); - emailLogRequest.setEntitytype(entityType); emailLogRequest.setRecipientEmails(recipientEmails); + emailLogRequest.setApplicatioId(applicationId); + emailLogRequest.setAmendmentId(amendmentId); + emailLogRequest.setCallId(callId); 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 5c06a906..2f193047 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -61,7 +61,7 @@ public class EmailNotificationDao { private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, - Map bodyPlaceholders, List additionalRecipients,Boolean isAmendment,Long amendmentId) { + Map bodyPlaceholders, List additionalRecipients,Long amendmentId) { HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); String service = determineService(applicationEntity.getHubId()); @@ -77,11 +77,7 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); - EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),subject,body, StatusTypeEnum.SUCCESS.getValue(), null, applicationEntity.getId(), EmailEntityTypeEnum.APPLICATION,Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId()); - if(Boolean.TRUE.equals(isAmendment) && amendmentId !=null){ - emailLogRequest.setEntitytype(EmailEntityTypeEnum.AMENDMENT); - emailLogRequest.setEntityId(amendmentId); - } + EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId(),Utils.listToCommaSeparatedString(recipientEmails),userEntity.getId(),applicationEntity.getId(),amendmentId ,applicationEntity.getCall().getId()); sendMail(applicationEntity.getHubId(), subject, body, recipientEmails,emailLogRequest); } private List getRecipientEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List additionalRecipients) { @@ -141,7 +137,7 @@ public class EmailNotificationDao { log.error("Failed to parse form fields JSON: ", e); } bodyPlaceholders.put("{{note}}", applicationAmendmentRequest.getNote()); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null,true,applicationAmendmentRequest.getId()); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null,applicationAmendmentRequest.getId()); } public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { @@ -151,14 +147,14 @@ public class EmailNotificationDao { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); LocalDateTime lastReminderDateTime=amendmentRequest.getCreatedDate(); - List emailLogEntity = emailLogRepository.findByUserIdAndEntityIdAndEntityTypeAndIsDeletedFalse(user.getId(),amendmentRequest.getId(),EmailEntityTypeEnum.AMENDMENT.getValue()); + List emailLogEntity = emailLogRepository.findByUserIdAndAmendmentIdAndIsDeletedFalse(user.getId(),amendmentRequest.getId()); 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(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,true,amendmentRequest.getId()); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,amendmentRequest.getId()); } public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { @@ -168,7 +164,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,false,null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,null); } public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { @@ -179,7 +175,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getNote()); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,false,null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,null); } public void sendMail(Long hubId, String subject, String body, List recipientEmails, EmailLogRequest emailLogRequest) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 8c2729a1..03ad4c2b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -45,11 +45,14 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "user_id") private Long userId; - @Column(name = "entity_id") - private Long entityId; + @Column(name = "application_id") + private Long applicationId; - @Column(name = "entity_type") - private String entityType; + @Column(name = "amendment_id") + private Long amendmentId; + + @Column(name = "call_id") + private Long callId; @Column(name = "is_deleted") private Boolean isDeleted; 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 b6e8c07b..b85f0e15 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailLogRequest.java @@ -23,10 +23,6 @@ public class EmailLogRequest { private String errorMessage; - private Long entityId; - - private EmailEntityTypeEnum entitytype; - private Long userId; private String emailServiceResponse; @@ -35,4 +31,10 @@ public class EmailLogRequest { private String recipientEmails; + private Long applicatioId; + + private Long amendmentId; + + private Long callId; + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java index 8cc9b470..20475e0b 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EmailLogRepository.java @@ -7,5 +7,5 @@ import java.util.List; public interface EmailLogRepository extends JpaRepository { - List findByUserIdAndEntityIdAndEntityTypeAndIsDeletedFalse(Long userId,Long entityId,String entityType); + List findByUserIdAndAmendmentIdAndIsDeletedFalse(Long userId,Long amendmentId); } 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 3bf2ecd8..978ea459 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -45,7 +45,9 @@ public class MailgunEmailService implements EmailService { // Send email via Mailgun API HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { - + emailLogRequest.setEmailSubject(subject); + emailLogRequest.setEmailBody(body); + emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); try { Unirest.setTimeouts(0, 0); 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 81991f69..4d076bb4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -50,6 +50,9 @@ public class PecEmailService implements EmailService { String authToken = emailConfig.getAuthToken(); HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { + emailLogRequest.setEmailSubject(emailRequest.getSubject()); + emailLogRequest.setEmailBody(emailRequest.getBody()); + emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(emailRequest.getRecipient())); try { Unirest.setTimeouts(0, 0); 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 58641af4..a7fe774d 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 @@ -1775,6 +1775,14 @@ + + + + + + + + From b8d9ab9c46d7368a8956761fa65912997d19b1d5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 19 Nov 2024 21:23:05 +0530 Subject: [PATCH 08/27] updated default_System_Receiver_Email property for production --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 8c19671b..b3704a3d 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -16,7 +16,7 @@ spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production isMailSendingEnabled = true -default_System_Receiver_Email=antonio.manca@bflows.net +default_System_Receiver_Email=c.moretti@gepafin.it gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net From 334f4b3a799320874eb621e42c4500b846c4ecca Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 20 Nov 2024 11:40:12 +0530 Subject: [PATCH 09/27] Issue With Application Deleted Documents --- .../dao/ApplicationAmendmentRequestDao.java | 5 +- .../tendermanagement/dao/ApplicationDao.java | 66 +++++++++- .../dao/ApplicationEvaluationDao.java | 113 ++++++++++-------- 3 files changed, 126 insertions(+), 58 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index d685796f..bead6d7a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -96,6 +96,8 @@ public class ApplicationAmendmentRequestDao { @Autowired private Validator validator; + @Autowired + private ApplicationDao applicationDao; public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); @@ -556,11 +558,10 @@ public class ApplicationAmendmentRequestDao { // Add valid new document IDs from the request existingDocumentIds.addAll(validDocumentIds); - + applicationDao.updateDocumentDeletionStatus(formEntity, updatedFormField, formEntity.getApplicationForm().getForm(), null,validDocumentIds); // Set the combined document IDs back as the field value formEntity.setFieldValue(String.join(",", existingDocumentIds)); applicationFormFieldRepository.save(formEntity); - log.info("Updated field value for application ID {} and field ID {} with document IDs {}", applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", existingDocumentIds)); fieldUpdated = true; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index cf2e08c2..1f573195 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -405,7 +405,7 @@ public class ApplicationDao { ApplicationFormFieldEntity applicationFormFieldEntity=null; - validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity); + List newDocumentIds =validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity); if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){ applicationFormFieldEntity = new ApplicationFormFieldEntity(); @@ -427,13 +427,73 @@ public class ApplicationDao { Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); if(applicationFormFieldRequestBean.getFieldValue() !=null ) { - applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue())); - } + updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null); + applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue())); + } if(applicationFormFieldRequestBean.getFieldValue() ==null ) { applicationFormFieldEntity.setFieldValue(null); } return applicationFormFieldRepository.save(applicationFormFieldEntity); } + void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List newDocumentIds, + List preInstructorDocumentId) { + if (newDocumentIds == null) { + newDocumentIds = Collections.emptyList(); + } + if (preInstructorDocumentId == null) { + preInstructorDocumentId = Collections.emptyList(); + } + + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); + for (ContentResponseBean contentResponseBean : contentResponseBeans) { + if (Boolean.FALSE.equals(contentResponseBean.getName().equals("fileupload"))) { + return; + } + } + + List currentDocumentIds = parseDocumentIds(applicationFormFieldEntity.getFieldValue()); + if (Boolean.FALSE.equals(newDocumentIds.isEmpty())) { + List finalNewDocumentIds = newDocumentIds; + List documentsToDelete = currentDocumentIds.stream() + .filter(docId -> !finalNewDocumentIds.contains(docId)) + .toList(); + documentsToDelete.forEach(docId -> documentService.deleteFile(docId)); + } + + if (Boolean.FALSE.equals(preInstructorDocumentId.isEmpty())){ + List preInstructorDocIds = preInstructorDocumentId.stream() + .map(Long::valueOf) + .collect(Collectors.toList()); + + List documentsToDelete = currentDocumentIds.stream() + .filter(docId -> !preInstructorDocIds.contains(docId)) + .toList(); + documentsToDelete.forEach(docId -> documentService.deleteFile(docId)); + } + } + + + private List parseDocumentIds(String fieldValue) { + if (fieldValue == null || fieldValue.isEmpty()) { + return Collections.emptyList(); + } + if (fieldValue.contains(",")) { + return Arrays.stream(fieldValue.split(",")) + .map(String::trim) + .map(Long::parseLong) + .collect(Collectors.toList()); + } else { + try { + return Collections.singletonList(Long.parseLong(fieldValue.trim())); + } catch (NumberFormatException e) { + e.printStackTrace(); + return Collections.emptyList(); + } + } + } + + + private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) { List documentIds=null; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 2bcbade9..9ab569b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -249,19 +249,21 @@ public class ApplicationEvaluationDao { List documentResponseBeans = new ArrayList<>(); for (String docId : documentIds) { - Long documentId = Long.valueOf(docId.trim()); - documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(documentEntity.getId()); - responseBean.setName(documentEntity.getFileName()); - responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - responseBean.setSourceId(documentEntity.getSourceId()); - responseBean.setFilePath(documentEntity.getFilePath()); - responseBean.setCreatedDate(documentEntity.getCreatedDate()); - responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(responseBean); - }); + if (Boolean.FALSE.equals(docId.isEmpty())){ + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } } mappedField.setFieldValue(documentResponseBeans); } @@ -351,19 +353,21 @@ public class ApplicationEvaluationDao { List documentResponseBeans = new ArrayList<>(); for (String docId : documentIds) { - Long documentId = Long.valueOf(docId.trim()); - documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(documentEntity.getId()); - responseBean.setName(documentEntity.getFileName()); - responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - responseBean.setSourceId(documentEntity.getSourceId()); - responseBean.setFilePath(documentEntity.getFilePath()); - responseBean.setCreatedDate(documentEntity.getCreatedDate()); - responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(responseBean); - }); + if (Boolean.FALSE.equals(docId.isEmpty())){ + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } } fieldResponse.setFileDetail(documentResponseBeans); @@ -888,19 +892,21 @@ public class ApplicationEvaluationDao { List documentResponseBeans = new ArrayList<>(); for (String docId : documentIds) { - Long documentId = Long.valueOf(docId.trim()); - documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(documentEntity.getId()); - responseBean.setName(documentEntity.getFileName()); - responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - responseBean.setSourceId(documentEntity.getSourceId()); - responseBean.setFilePath(documentEntity.getFilePath()); - responseBean.setCreatedDate(documentEntity.getCreatedDate()); - responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(responseBean); - }); + if (Boolean.FALSE.equals(docId.isEmpty())) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } } fieldResponse.setFileDetail(documentResponseBeans); @@ -1247,21 +1253,22 @@ public class ApplicationEvaluationDao { List documentResponseBeans = new ArrayList<>(); for (String docId : documentIds) { - Long documentId = Long.valueOf(docId.trim()); - documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(documentEntity.getId()); - responseBean.setName(documentEntity.getFileName()); - responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - responseBean.setSourceId(documentEntity.getSourceId()); - responseBean.setFilePath(documentEntity.getFilePath()); - responseBean.setCreatedDate(documentEntity.getCreatedDate()); - responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(responseBean); - }); + if (Boolean.FALSE.equals(docId.isEmpty())){ + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } } - fieldResponse.setFileDetail(documentResponseBeans); fieldResponses.add(fieldResponse); } From 2a63474fda24d85c1863a1098a6a4abb424d8710 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 20 Nov 2024 14:59:53 +0530 Subject: [PATCH 10/27] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 2 +- .../tendermanagement/dao/ApplicationDao.java | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index bead6d7a..df073dd9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -558,7 +558,7 @@ public class ApplicationAmendmentRequestDao { // Add valid new document IDs from the request existingDocumentIds.addAll(validDocumentIds); - applicationDao.updateDocumentDeletionStatus(formEntity, updatedFormField, formEntity.getApplicationForm().getForm(), null,validDocumentIds); + applicationDao.updateDocumentDeletionStatus(formEntity, updatedFormField, formEntity.getApplicationForm().getForm(), null,validDocumentIds,true); // Set the combined document IDs back as the field value formEntity.setFieldValue(String.join(",", existingDocumentIds)); applicationFormFieldRepository.save(formEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 1f573195..19adbb3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -427,16 +427,17 @@ public class ApplicationDao { Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); if(applicationFormFieldRequestBean.getFieldValue() !=null ) { - updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null); + updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null,false); applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue())); } if(applicationFormFieldRequestBean.getFieldValue() ==null ) { + updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null,false); applicationFormFieldEntity.setFieldValue(null); } return applicationFormFieldRepository.save(applicationFormFieldEntity); } void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List newDocumentIds, - List preInstructorDocumentId) { + List preInstructorDocumentId,boolean isPreInstructor) { if (newDocumentIds == null) { newDocumentIds = Collections.emptyList(); } @@ -450,17 +451,22 @@ public class ApplicationDao { return; } } - + if(!isPreInstructor){ List currentDocumentIds = parseDocumentIds(applicationFormFieldEntity.getFieldValue()); - if (Boolean.FALSE.equals(newDocumentIds.isEmpty())) { + if (Boolean.TRUE.equals(newDocumentIds.isEmpty())) { + currentDocumentIds.forEach(docId -> documentService.deleteFile(docId)); + } else { List finalNewDocumentIds = newDocumentIds; List documentsToDelete = currentDocumentIds.stream() .filter(docId -> !finalNewDocumentIds.contains(docId)) .toList(); documentsToDelete.forEach(docId -> documentService.deleteFile(docId)); - } - - if (Boolean.FALSE.equals(preInstructorDocumentId.isEmpty())){ + }} + else{ + List currentDocumentIds = parseDocumentIds(applicationFormFieldEntity.getFieldValue()); + if (Boolean.TRUE.equals(preInstructorDocumentId.isEmpty())) { + currentDocumentIds.forEach(docId -> documentService.deleteFile(docId)); + } else { List preInstructorDocIds = preInstructorDocumentId.stream() .map(Long::valueOf) .collect(Collectors.toList()); @@ -469,7 +475,7 @@ public class ApplicationDao { .filter(docId -> !preInstructorDocIds.contains(docId)) .toList(); documentsToDelete.forEach(docId -> documentService.deleteFile(docId)); - } + }} } From 49a122aba7a2ac41bff736c61c97d54ecab02024 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 20 Nov 2024 18:43:33 +0530 Subject: [PATCH 11/27] Added an optional parameter onlyPreferredCall in the getAllCalls API to filter the response and include only preferred calls --- .../constants/GepafinConstant.java | 2 ++ .../gepafin/tendermanagement/dao/CallDao.java | 20 +++++++++++++++++-- .../repositories/CallRepository.java | 2 ++ .../tendermanagement/service/CallService.java | 2 +- .../service/impl/CallServiceImpl.java | 4 ++-- .../web/rest/api/CallApi.java | 4 ++-- .../web/rest/api/impl/CallApiController.java | 4 ++-- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 9 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index b1704c6a..a6470a6a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -292,5 +292,7 @@ public class GepafinConstant { public static final String ENCRYPT_KEY = "U2VjdXJlRW5jcnlwdEtleQ=="; public static final String APPLICATION_DOCUMENTS_NOT_FOUND_MSG = "application.documents.not.found"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; + public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index fe692b69..b19a50d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -656,13 +656,29 @@ public class CallDao { return createCallResponseBean; } - public List getAllCalls(HttpServletRequest request,UserEntity user, Long companyId) { + public List getAllCalls(HttpServletRequest request,UserEntity user, Long companyId,Boolean onlyPreferredCall) { String type = user.getRoleEntity().getRoleType(); List callStatusList = CallStatusEnum.getStatusValues(); if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); } - List calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); + List calls; + if (Boolean.TRUE.equals(onlyPreferredCall) && companyId == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL)); + } + + if (Boolean.TRUE.equals(onlyPreferredCall)) { + validator.validateUserWithCompany(request, companyId); + List preferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndCompanyIdAndIsDeletedFalse(user.getId(), companyId); + List preferredCallIds = preferredCalls.stream() + .map(BeneficiaryPreferredCallEntity::getCallId) + .collect(Collectors.toList()); + calls = callRepository.findByIdInAndStatusIn(preferredCallIds, callStatusList); + } else { + calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); + } List callIds = calls.stream().map(CallEntity::getId).collect(Collectors.toList()); Map preferredCallsMap = getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 27ab57b4..833e1d68 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -45,4 +45,6 @@ public interface CallRepository extends JpaRepository { @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH' And c.hub.id = :hubId") BigDecimal findTotalAmountOfPublishedCallsAndHubId(@Param("hubId") Long hubId); + @Query("SELECT c FROM CallEntity c WHERE c.id IN :ids AND c.status IN :status") + List findByIdInAndStatusIn(@Param("ids") List ids, @Param("status") List status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index c40457de..8762d576 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -21,7 +21,7 @@ public interface CallService { CallResponse getCallById (HttpServletRequest request, Long callId,Long companyId); - List getAllCalls(HttpServletRequest request,Long companyId); + List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall); CallResponse validateCallData(HttpServletRequest request, Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index c5839bbc..38fd9562 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -62,9 +62,9 @@ public class CallServiceImpl implements CallService { @Override @Transactional(readOnly = true) - public List getAllCalls(HttpServletRequest request,Long companyId) { + public List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { UserEntity user = validator.validateUser(request); - return callDao.getAllCalls(request,user,companyId); + return callDao.getAllCalls(request,user,companyId,onlyPreferredCall); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 00a3e190..5a7d0384 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -100,8 +100,8 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - ResponseEntity>> getAllCalls(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId); - + ResponseEntity>> getAllCalls(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall); + @Operation(summary = "Api to validate call", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 32c89055..01f3d5f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -67,8 +67,8 @@ public class CallApiController implements CallApi { @Override @Transactional(readOnly = true) - public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId) { - List calls = callService.getAllCalls(request,companyId); + public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { + List calls = callService.getAllCalls(request,companyId,onlyPreferredCall); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 69c7410a..87c95e39 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -308,3 +308,4 @@ invalid.amendment.for.comment = Invalid Amendment Request for the Given Comment. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm application.documents.not.found=No documents found for the application. beneficiary.call.duplicate = A preferred call with this call ID and company ID already exists for this user. +company.id.required.for.preferred.call=Company ID is required when requesting only preferred calls. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index e1cb500d..c4763ec7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -303,3 +303,4 @@ beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non � st reminder.email.sent.success.msg=Email di promemoria inviata con successo! application.documents.not.found=Nessun documento trovato per la domanda. beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e ID azienda esiste gi� per questo utente. +company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. From 51791074abbb7e6c8e8c6b6a864ee7d7f4c38f4a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 20 Nov 2024 19:04:13 +0530 Subject: [PATCH 12/27] Done ticket GEPAFINBE-102 --- .../tendermanagement/constants/GepafinConstant.java | 1 + .../service/impl/ApplicationServiceImpl.java | 7 +++++++ .../tendermanagement/web/rest/api/ApplicationApi.java | 2 +- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index b1704c6a..219c5647 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -292,5 +292,6 @@ public class GepafinConstant { public static final String ENCRYPT_KEY = "U2VjdXJlRW5jcnlwdEtleQ=="; public static final String APPLICATION_DOCUMENTS_NOT_FOUND_MSG = "application.documents.not.found"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; + public static final String USER_MUST_BE_ASSOCIATED_WITH_COMPANY="user.must.be.associated.with.company.to.create.application"; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 0fec17a7..a8d63f1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; @@ -17,6 +19,8 @@ import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResp import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -64,6 +68,9 @@ public class ApplicationServiceImpl implements ApplicationService { @Transactional(rollbackFor = Exception.class) public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { UserEntity userEntity = validator.validateUser(request); + if(companyId==null){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.USER_MUST_BE_ASSOCIATED_WITH_COMPANY)); + } CompanyEntity companyEntity = validator.validateUserWithCompany(request, companyId); validator.validateUserWithCall(userEntity, callId); return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index d37c004e..d72f4daf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -99,7 +99,7 @@ public interface ApplicationApi { @PostMapping(value = "/call/{callId}", produces = { "application/json" }) ResponseEntity> createApplicationByCallId(HttpServletRequest request, - @Parameter(description = "The company ID", required = true) @RequestParam(value = "companyId", required = true) Long companyId, + @Parameter(description = "The company ID") @RequestParam(value = "companyId", required = false) Long companyId, @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequest applicationRequest, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 69c7410a..41ebe401 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -308,3 +308,4 @@ invalid.amendment.for.comment = Invalid Amendment Request for the Given Comment. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm application.documents.not.found=No documents found for the application. beneficiary.call.duplicate = A preferred call with this call ID and company ID already exists for this user. +user.must.be.associated.with.company.to.create.application=You must be associated with a company to apply for this application. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index e1cb500d..43a8bbff 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -303,3 +303,4 @@ beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non � st reminder.email.sent.success.msg=Email di promemoria inviata con successo! application.documents.not.found=Nessun documento trovato per la domanda. beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e ID azienda esiste gi� per questo utente. +user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione. From cac2fd209b7410116ff2a3637af247ba979a02e4 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 12:34:18 +0530 Subject: [PATCH 13/27] Updated code --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 2 +- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index a6470a6a..272d3f23 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -293,6 +293,6 @@ public class GepafinConstant { public static final String APPLICATION_DOCUMENTS_NOT_FOUND_MSG = "application.documents.not.found"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; - + public static final String CREATED_DATE = "createdDate"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index b5f4d7ea..58f41f7c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -338,7 +338,8 @@ public class ApplicationDao { predicate = builder.and(predicate, root.get("status").in(statusNames)); } predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); - return predicate; + query.orderBy(builder.desc(root.get(GepafinConstant.CREATED_DATE))); + return predicate; }; } From 2cc9ad5e23fdb2b840db82ea0c7919262a4844c2 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 13:30:59 +0530 Subject: [PATCH 14/27] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index a4da3b00..45cb6f70 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -235,19 +235,23 @@ public class ApplicationAmendmentRequestDao { userEntity.getHub().getId()); applicationAmendmentRequestEntity.setProtocol(protocolEntity); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); - - //Set Status - applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); + String evaluationStatusType = applicationEvaluationEntity.getStatus(); + if (Boolean.FALSE.equals(evaluationStatusType.equals((ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue())))){ + applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); applicationEvaluationRepository.save(applicationEvaluationEntity); - + } ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); - applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue()); - applicationRepository.save(applicationEntity); - + String applicationStatusType = applicationEntity.getStatus(); + if (Boolean.FALSE.equals(applicationStatusType.equals((ApplicationStatusTypeEnum.SOCCORSO.getValue())))) { + applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue()); + applicationRepository.save(applicationEntity); + } AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); - assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue()); - assignedApplicationsRepository.save(assignedApplicationsEntity); - + String assignedStatusType = assignedApplicationsEntity.getStatus(); + if (Boolean.FALSE.equals(assignedStatusType.equals((AssignedApplicationEnum.SOCCORSO.getValue())))) { + assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue()); + assignedApplicationsRepository.save(assignedApplicationsEntity); + } return applicationAmendment; } @@ -649,12 +653,16 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(existingApplicationAmendment.getApplicationEvaluationEntity().getId()); - boolean allClosed = amendmentRequests.stream() + Boolean allClosed = amendmentRequests.stream() .allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); - - if (allClosed) { + ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId()); + if (Boolean.TRUE.equals(allClosed)){ existingApplicationAmendment.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity()); + application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); + applicationRepository.save(application); + existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue()); + assignedApplicationsRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity()); log.info("All amendments are closed. Application Evaluation status set to OPEN."); } log.info("Application Amendment closed successfully: {}", response); From 65bc02223d3a0611333546d4b3997b280d2be888 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 15:11:41 +0530 Subject: [PATCH 15/27] Updated code --- .../tendermanagement/constants/GepafinConstant.java | 2 +- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 272d3f23..f3aa3455 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -293,6 +293,6 @@ public class GepafinConstant { public static final String APPLICATION_DOCUMENTS_NOT_FOUND_MSG = "application.documents.not.found"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; - public static final String CREATED_DATE = "createdDate"; + public static final String SUBMISSION_DATE = "submissionDate"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 58f41f7c..90328086 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -337,8 +337,11 @@ public class ApplicationDao { .collect(Collectors.toList()); predicate = builder.and(predicate, root.get("status").in(statusNames)); } - predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); - query.orderBy(builder.desc(root.get(GepafinConstant.CREATED_DATE))); + query.orderBy( + builder.desc(builder.isNotNull(root.get(GepafinConstant.SUBMISSION_DATE))), + builder.desc(root.get(GepafinConstant.SUBMISSION_DATE)) + ); + return predicate; }; } From ce26a33f6ab722a42307f5fdd42caa82256518cc Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 16:47:09 +0530 Subject: [PATCH 16/27] Updated code --- .../repositories/BeneficiaryPreferredCallRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java index 1101d1a6..c83be4d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java @@ -13,7 +13,7 @@ public interface BeneficiaryPreferredCallRepository extends JpaRepository findByBeneficiaryIdAndIsDeletedFalse(Long beneficiaryId); List findByUserIdAndIsDeletedFalse(Long userId); - @Query("SELECT preferredCall FROM BeneficiaryPreferredCallEntity preferredCall where preferredCall.userId=:userId AND (:companyId is null OR preferredCall.companyId=:companyId)") + @Query("SELECT preferredCall FROM BeneficiaryPreferredCallEntity preferredCall where preferredCall.userId=:userId AND (:companyId is null OR preferredCall.companyId=:companyId) AND isDeleted=false") List findByUserIdAndCompanyIdAndIsDeletedFalse(@Param("userId") Long userId, @Param("companyId") Long companyId); List findByBeneficiaryIdAndCompanyId(Long beneficiaryId,Long companyId); List findByUserIdAndCallIdInAndIsDeletedFalse(Long userId, List callIds); From 13fa7807e9c8829c7b7160abd93a38f3f920ca8d Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 17:36:41 +0530 Subject: [PATCH 17/27] Added column to communication table --- .../dao/CommunicationDao.java | 19 ++++++- .../entities/CommunicationEntity.java | 6 +++ .../response/CommunicationResponseBean.java | 4 ++ .../service/CommunicationService.java | 9 ++-- .../impl/CommunicationServiceImpl.java | 51 +++++++++++++++---- .../web/rest/api/CommunicationApi.java | 5 +- .../api/impl/CommunicationController.java | 10 ++-- .../db/changelog/db.changelog-1.0.0.xml | 41 ++++++++++----- 8 files changed, 110 insertions(+), 35 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index afe7e21e..75926512 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; @@ -9,6 +10,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.repositories.CommunicationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -27,9 +29,12 @@ public class CommunicationDao { private CommunicationRepository communicationRepository; @Autowired - ApplicationAmendmentRequestService applicationAmendmentRequestService; + private ApplicationAmendmentRequestService applicationAmendmentRequestService; - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq, Long amendmentId) { + @Autowired + private Validator validator; + + public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationReq, Long amendmentId) { log.info("Adding communication request..."); CommunicationEntity communicationEntity = convertToCommunicationCommentEntity(communicationReq, amendmentId); @@ -85,18 +90,28 @@ public class CommunicationDao { response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); response.setTitle(entity.getCommunicationTitle()); + response.setSenderUserId(entity.getSenderUserId()); + response.setReceiverUserId(entity.getReceiverUserId()); return response; } private CommunicationEntity convertToCommunicationCommentEntity(CommunicationRequestBean communicationReq, Long amendmentId) { ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestService.validateApplicationAmendmentRequest(amendmentId); + CommunicationEntity communicationEntity = new CommunicationEntity(); communicationEntity.setApplicationAmendmentRequest(amendmentRequest); communicationEntity.setCommunicationTitle(communicationReq.getTitle()); communicationEntity.setCommunicationComment(communicationReq.getComment()); communicationEntity.setIsDeleted(false); communicationEntity.setCommentedDate(LocalDateTime.now()); + if(validator.checkIsPreInstructor()){ + communicationEntity.setSenderUserId(amendmentRequest.getApplicationEvaluationEntity().getUserId()); + communicationEntity.setReceiverUserId(amendmentRequest.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + } else if(validator.checkIsBeneficiary()) { + communicationEntity.setSenderUserId(amendmentRequest.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + communicationEntity.setReceiverUserId(amendmentRequest.getApplicationEvaluationEntity().getUserId()); + } return communicationEntity; } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java index 7aa43acd..9029649e 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java @@ -26,6 +26,12 @@ public class CommunicationEntity extends BaseEntity { @Column(name = "COMMENTED_DATE") private LocalDateTime commentedDate; + @Column(name = "SENDER_USER_ID") + private Long senderUserId; + + @Column(name = "RECEIVER_USER_ID") + private Long receiverUserId; + @ManyToOne @JoinColumn(name = "AMENDMENT_ID", referencedColumnName = "id", nullable = false) private ApplicationAmendmentRequestEntity applicationAmendmentRequest; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java index d1405dd8..13afde4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java @@ -16,6 +16,10 @@ public class CommunicationResponseBean { private LocalDateTime updatedDate; + private Long senderUserId; + + private Long receiverUserId; + private Long amendmentId; public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java b/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java index 5f8f1cd3..6c99f4a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java @@ -1,15 +1,16 @@ package net.gepafin.tendermanagement.service; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; public interface CommunicationService { - CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean, Long amendmentId); + CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request ,CommunicationRequestBean communicationRequestBean, Long amendmentId); - String deleteComment(Long amendmentId, Long commentId); + String deleteComment(HttpServletRequest request,Long amendmentId, Long commentId); - CommunicationResponseBean updateAmendmentComment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId); + CommunicationResponseBean updateAmendmentComment(HttpServletRequest request,CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId); - ApplicationAmendmentResponse getAmendmentComments(Long id); + ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java index 5a9b9c06..de3e5030 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java @@ -1,43 +1,76 @@ package net.gepafin.tendermanagement.service.impl; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; import net.gepafin.tendermanagement.dao.CommunicationDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.service.CommunicationService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + @Service public class CommunicationServiceImpl implements CommunicationService { @Autowired CommunicationDao communicationDao; + @Autowired + ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + + @Autowired + Validator validator; + @Override @Transactional(rollbackFor = Exception.class) - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean, Long amendmentId) { - - return communicationDao.addCommentToAmendmentRequest(communicationRequestBean, amendmentId); + public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request ,CommunicationRequestBean communicationRequestBean, Long amendmentId) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(amendmentId); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); + } else { + validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + } + return communicationDao.addCommentToAmendmentRequest(request,communicationRequestBean, amendmentId); } + @Override @Transactional(rollbackFor = Exception.class) - public String deleteComment(Long amendmentId, Long commentId) { - + public String deleteComment(HttpServletRequest request ,Long amendmentId, Long commentId) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(amendmentId); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); + } else { + validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + } return communicationDao.deleteComment(amendmentId, commentId); } @Override @Transactional(rollbackFor = Exception.class) - public CommunicationResponseBean updateAmendmentComment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { - + public CommunicationResponseBean updateAmendmentComment(HttpServletRequest request,CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(amendmentId); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); + } else { + validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + } return communicationDao.updateAmendmentComment(communicationRequestBean, amendmentId, commentId); } + @Override @Transactional(readOnly = true) - public ApplicationAmendmentResponse getAmendmentComments(Long id) { - + public ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); + } else { + validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); + } return communicationDao.getAmendmentComments(id); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java index eb1351c9..a648b08b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.data.repository.query.Param; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -32,6 +33,7 @@ public interface CommunicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/{amendmentId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY')") ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(value = "amendmentId") Long amendmentId); @@ -43,7 +45,7 @@ public interface CommunicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) }) @GetMapping(value = "/{amendmentId}", produces = "application/json") - public ResponseEntity> getAmendmentComments(@PathVariable(value = "amendmentId") Long amendmentId); + public ResponseEntity> getAmendmentComments(HttpServletRequest request,@PathVariable(value = "amendmentId") Long amendmentId); @Operation(summary = "Api to update communication comments", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -53,6 +55,7 @@ public interface CommunicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY')") ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(value = "amendmentId") Long amendmentId, @PathVariable(value = "commentId") Long commentId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java index 4805d2ce..92aa71cf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java @@ -27,28 +27,28 @@ public class CommunicationController implements CommunicationApi { public ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, Long amendmentId) { - CommunicationResponseBean communicationResponseBean = communicationService.addCommentToAmendmentRequest(communicationRequestBean, amendmentId); + CommunicationResponseBean communicationResponseBean = communicationService.addCommentToAmendmentRequest(request,communicationRequestBean, amendmentId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); } @Override - public ResponseEntity> getAmendmentComments(Long amendmentId) { + public ResponseEntity> getAmendmentComments(HttpServletRequest request,Long amendmentId) { - ApplicationAmendmentResponse response = communicationService.getAmendmentComments(amendmentId); + ApplicationAmendmentResponse response = communicationService.getAmendmentComments(request,amendmentId); return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS))); } @Override public ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { - CommunicationResponseBean communicationResponseBean = communicationService.updateAmendmentComment(communicationRequestBean, amendmentId, commentId); + CommunicationResponseBean communicationResponseBean = communicationService.updateAmendmentComment(request,communicationRequestBean, amendmentId, commentId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_UPDATED_SUCCESS_MSG))); } @Override public ResponseEntity> deleteApplicationAmendmentComment(HttpServletRequest request, Long applicationAmendId, Long commentId) { - String communicationResponseBean = communicationService.deleteComment(applicationAmendId, commentId); + String communicationResponseBean = communicationService.deleteComment(request,applicationAmendId, commentId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_DELETED_SUCCESS_MSG))); } 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 a7fe774d..05f8d108 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 @@ -1345,7 +1345,7 @@ referencedColumnNames="id"/> - + - + @@ -1693,15 +1693,15 @@ - - - UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' - - - - UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' - - + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + + UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' + + select setval('gepafin_schema.system_email_template_id_seq', (select @@ -1763,7 +1763,7 @@ - + @@ -1771,11 +1771,11 @@ - + - + @@ -1785,4 +1785,17 @@ + + + + + + + + + + + role_type = 'ROLE_PRE_INSTRUCTOR' + + From aa37f7d3c35bcde16062b72f2bd01ef2b8909470 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 21 Nov 2024 18:01:11 +0530 Subject: [PATCH 18/27] Fixed application hub issue --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f68f76cc..8d1462ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -341,7 +341,7 @@ public class ApplicationDao { builder.desc(builder.isNotNull(root.get(GepafinConstant.SUBMISSION_DATE))), builder.desc(root.get(GepafinConstant.SUBMISSION_DATE)) ); - + predicate = builder.and(predicate, root.get("hubId").in(userEntity.getHub().getId())); return predicate; }; } From 275a1ba28728ad1645ff0dd31c0ad0b81aaebb88 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 21 Nov 2024 18:08:47 +0530 Subject: [PATCH 19/27] updated code --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8d1462ce..017870ed 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -341,7 +341,7 @@ public class ApplicationDao { builder.desc(builder.isNotNull(root.get(GepafinConstant.SUBMISSION_DATE))), builder.desc(root.get(GepafinConstant.SUBMISSION_DATE)) ); - predicate = builder.and(predicate, root.get("hubId").in(userEntity.getHub().getId())); + predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); return predicate; }; } From bacbc173070d78820231541571c879e38bc65ac7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 21 Nov 2024 18:27:20 +0530 Subject: [PATCH 20/27] Create Evaluation when assigned to Instructor --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 6 +++++- .../tendermanagement/dao/AssignedApplicationsDao.java | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 2bcbade9..5a28e86a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -15,6 +15,7 @@ import net.gepafin.tendermanagement.model.request.FieldRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Utils; @@ -81,12 +82,15 @@ public class ApplicationEvaluationDao { @Autowired private FormDao formDao; + + @Autowired + private AssignedApplicationsService assignedApplicationsService; private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId).orElse(null); + AssignedApplicationsEntity assignedApplications = assignedApplicationsService.validateAssignedApplication(assignedApplciationId); ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); entity.setApplicationId(application.getId()); entity.setAssignedApplicationsEntity(assignedApplications); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index b3e27da5..b83f8689 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.repositories.ApplicationRepository; @@ -47,6 +48,8 @@ public class AssignedApplicationsDao { @Autowired private Validator validator; + @Autowired + private ApplicationEvaluationDao applicationEvaluationDao; public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); @@ -69,7 +72,7 @@ public class AssignedApplicationsDao { UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); - + applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignApplicationToInstructorResponse.getId()); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); return assignApplicationToInstructorResponse; } From ccd5d9408a7d73d5e9073a61f77c6fc29f61afcb Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 22 Nov 2024 12:52:22 +0530 Subject: [PATCH 21/27] Added companyName in assigned application response --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 1 + .../tendermanagement/dao/AssignedApplicationsDao.java | 5 +++++ .../model/response/AssignedApplicationsResponse.java | 1 + 3 files changed, 7 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index fa2fceda..e3304967 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -295,5 +295,6 @@ public class GepafinConstant { public static final String USER_MUST_BE_ASSOCIATED_WITH_COMPANY="user.must.be.associated.with.company.to.create.application"; public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; public static final String SUBMISSION_DATE = "submissionDate"; + public static final String ASSIGNED_AT = "assignedAt"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index b3e27da5..ca6e44ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -128,6 +128,7 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt()); assignedApplicationsResponse.setProtocolNumber(protocolNumber); assignedApplicationsResponse.setCallName(callName); + assignedApplicationsResponse.setCompanyName(application.getCompany().getCompanyName()); assignedApplicationsResponse.setBeneficiaryName(beneficiaryName); assignedApplicationsResponse.setSubmissionDate(submissionDate); assignedApplicationsResponse.setCallEndDate(callEndDate); @@ -171,6 +172,10 @@ public class AssignedApplicationsDao { if (userId != null) { predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); } + query.orderBy( + builder.desc(builder.isNotNull(root.get(GepafinConstant.ASSIGNED_AT))), + builder.desc(root.get(GepafinConstant.ASSIGNED_AT)) + ); predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), hubId)); return predicate; }; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index b5ad3aae..3affe42f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -20,6 +20,7 @@ public class AssignedApplicationsResponse extends BaseBean { private LocalDateTime submissionDate; private LocalDateTime callStartDate; private LocalDateTime callEndDate; + private String companyName; } From bd66c711fe3addc68ecdc0b12026259e765f98ee Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 22 Nov 2024 14:05:22 +0530 Subject: [PATCH 22/27] Added motivation text field in application evaluation --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 4 ++++ .../entities/ApplicationEvaluationEntity.java | 3 +++ .../model/request/ApplicationEvaluationRequest.java | 1 + .../model/response/ApplicationEvaluationResponse.java | 1 + src/main/resources/db/changelog/db.changelog-1.0.0.xml | 5 +++++ 5 files changed, 14 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 121d7dfe..1b725c96 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -99,6 +99,7 @@ public class ApplicationEvaluationDao { entity.setChecklist(Utils.convertObjectToJson(req.getChecklist())); entity.setFile(Utils.convertObjectToJson(req.getFiles())); entity.setNote(req.getNote()); + entity.setMotivation(req.getMotivation()); entity.setIsDeleted(false); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); return entity; @@ -130,6 +131,7 @@ public class ApplicationEvaluationDao { AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(entity.getAssignedApplicationsEntity().getId()).orElse(null); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(entity.getNote()); + response.setMotivation(entity.getMotivation()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); @@ -437,6 +439,7 @@ public class ApplicationEvaluationDao { entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req)))); entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); + setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); } else { entity = convertToEntity(user, req, assignedApplicationId); } @@ -636,6 +639,7 @@ public class ApplicationEvaluationDao { response.setApplicationId(application.getId()); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(null); + response.setMotivation(null); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index dae9a3fb..e2bb27aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -28,6 +28,9 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "status") private String status; + + @Column(name = "MOTIVATION") + private String motivation; @Column(name="IS_DELETED") private Boolean isDeleted; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java index 9563f00b..df29c1d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -12,4 +12,5 @@ public class ApplicationEvaluationRequest { private List files; private String note; private ApplicationStatusForEvaluation applicationStatus; + private String motivation; } 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 f0be1236..7f4722e2 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -26,6 +26,7 @@ public class ApplicationEvaluationResponse { private String beneficiary; private Long protocolNumber; private String callName; + private String motivation; private LocalDateTime submissionDate; private LocalDateTime evaluationDate; private LocalDateTime callEndDate; 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 05f8d108..ea473da2 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 @@ -1798,4 +1798,9 @@ role_type = 'ROLE_PRE_INSTRUCTOR' + + + + + From ac6c4ba0b0de322eb7ca3a808757f1bfb3edf139 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 24 Nov 2024 20:14:09 +0530 Subject: [PATCH 23/27] updated code for amendment api --- .../dao/ApplicationAmendmentRequestDao.java | 730 +++++++++++------- .../tendermanagement/dao/DocumentDao.java | 2 +- .../model/request/AmendmentFormField.java | 33 + .../ApplicationAmendmentRequestBean.java | 4 +- .../ApplicationFormFieldRepository.java | 2 + ...pplicationAmendmentRequestServiceImpl.java | 15 +- .../api/ApplicationAmendmentRequestApi.java | 2 +- ...ApplicationAmendmentRequestController.java | 4 +- 8 files changed, 481 insertions(+), 311 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 4f968499..45d6fdb3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -12,6 +12,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.request.AmendmentFormField.AmendmentIsUploadedByEnum; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; @@ -21,6 +22,8 @@ import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.jpa.domain.Specification; @@ -29,6 +32,8 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collector; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.log; @@ -218,10 +223,10 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestEntity.setApplicationId(applicationId); if (applicationAmendmentRequest.getFormFields() != null) { - List formFieldRequestBean = applicationAmendmentRequest.getFormFields().stream() + List formFieldRequestBean = applicationAmendmentRequest.getFormFields().stream() .filter(AmendmentFormFieldResponse::isSelected) .map(amendmentFormFieldRequest -> { - ApplicationFormFieldRequestBean formField = new ApplicationFormFieldRequestBean(); + AmendmentFormField formField = new AmendmentFormField(); formField.setFieldId(amendmentFormFieldRequest.getFieldId()); formField.setFieldValue(null); return formField; @@ -263,132 +268,134 @@ public class ApplicationAmendmentRequestDao { } public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { - ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = new ApplicationAmendmentRequestResponse(); - applicationAmendmentRequestResponse.setId(applicationAmendmentRequestEntity.getId()); - Long applicationId = applicationAmendmentRequestEntity.getApplicationId(); + ApplicationAmendmentRequestResponse response = initializeBasicResponse(applicationAmendmentRequestEntity); + + List forms = applicationFormRepository.findByApplicationId(applicationAmendmentRequestEntity.getApplicationId()); + Map fieldIdToLabelMap = extractFieldIdToLabelMap(forms); - ApplicationEntity application = applicationService.validateApplication(applicationId); - applicationAmendmentRequestResponse.setApplicationId(applicationId); - applicationAmendmentRequestResponse.setCallEmail(application.getCall().getEmail()); - applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); - applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); - applicationAmendmentRequestResponse.setStatus(ApplicationAmendmentRequestEnum.valueOf(applicationAmendmentRequestEntity.getStatus())); - applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); - applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote()); - LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate(); - applicationAmendmentRequestResponse.setStartDate(startDate); + List amendmentFormFields = Utils.convertJsonStringToList( + applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); + Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); - LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); - applicationAmendmentRequestResponse.setExpirationDate(expirationDate); + processFormFields(amendmentFormFields, fieldIdToLabelMap, formFieldEntityMap, response); - applicationAmendmentRequestResponse.setIsSendEmail(applicationAmendmentRequestEntity.getIsEmail()); - applicationAmendmentRequestResponse.setIsSendNotification(applicationAmendmentRequestEntity.getIsNotification()); - String callName = application.getCall().getName(); - Long protocolNumber = (applicationAmendmentRequestEntity.getProtocol() != null && applicationAmendmentRequestEntity.getProtocol().getProtocolNumber() != null) - ? applicationAmendmentRequestEntity.getProtocol().getProtocolNumber() - : null; - UserEntity userEntity = userService.validateUser(application.getUserId()); - String firstName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getFirstName() : ""; - String lastName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getLastName() : ""; - - String beneficiaryName = (!firstName.isBlank() ? firstName : "") + - (!lastName.isBlank() ? " " + lastName : ""); - - beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; - applicationAmendmentRequestResponse.setCallName(callName); - applicationAmendmentRequestResponse.setProtocolNumber(protocolNumber); - applicationAmendmentRequestResponse.setBeneficiaryName(beneficiaryName); - - List forms = applicationFormRepository.findByApplicationId(applicationId); - List allFormFields = new ArrayList<>(); - - for (ApplicationFormEntity form : forms) { - String content = form.getForm().getContent(); - List> result = filterByName(content, "fileupload"); - allFormFields.addAll(getIdAndLabelFromResult(result)); - } - - Map fieldIdToLabelMap = allFormFields.stream() - .collect(Collectors.toMap(AmendmentFormFieldResponse::getFieldId, AmendmentFormFieldResponse::getLabel)); - - String formFieldsJson = applicationAmendmentRequestEntity.getFormFields(); - List formFields = Utils.convertJsonToList( - formFieldsJson, new TypeReference>() { - }); - - for (AmendmentFormFieldResponse formField : formFields) { - String label = fieldIdToLabelMap.get(formField.getFieldId()); - formField.setLabel(label); - formField.setSelected(true); - } - // Set the filtered formFields in the response - applicationAmendmentRequestResponse.setFormFields(formFields); - - String applicationFormFieldsJson = applicationAmendmentRequestEntity.getFormFields(); - List applicationFormFields = Utils.convertJsonToList( - formFieldsJson, new TypeReference>() { - }); - - List fileDetailResponses = new ArrayList<>(); - for (ApplicationFormFieldResponseBean field : applicationFormFields) { - ApplicationFormFieldResponseBean responseBean = new ApplicationFormFieldResponseBean(); - responseBean.setFieldId(field.getFieldId()); - - Optional formFieldEntity = Optional.empty(); - for (ApplicationFormEntity form : forms) { - formFieldEntity = applicationFormFieldRepository - .findByApplicationFormIdAndFieldId(form.getId(), field.getFieldId()); - if (formFieldEntity.isPresent()) { - // Set the applicationFormId from the matching form - responseBean.setApplicationFormId(form.getId()); - responseBean.setId(formFieldEntity.get().getId()); - responseBean.setCreatedDate(formFieldEntity.get().getCreatedDate()); - responseBean.setUpdatedDate(formFieldEntity.get().getUpdatedDate()); - break; - } - } - - // Check if fieldValue is not null and is a String - if (field.getFieldValue() instanceof String && field.getFieldValue() != null && !((String) field.getFieldValue()).isBlank()) { - String fieldValueString = (String) field.getFieldValue(); - String[] documentIds = fieldValueString.split(","); - List documentResponseBeans = new ArrayList<>(); - - // Process each document ID - for (String docId : documentIds) { - try { - Long documentId = Long.valueOf(docId.trim()); - documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean docBean = new DocumentResponseBean(); - docBean.setId(documentEntity.getId()); - docBean.setName(documentEntity.getFileName()); - docBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - docBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - docBean.setSourceId(documentEntity.getSourceId()); - docBean.setFilePath(documentEntity.getFilePath()); - docBean.setCreatedDate(documentEntity.getCreatedDate()); - docBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(docBean); - }); - } catch (NumberFormatException e) { - // Handle the case where documentId is not a valid number - // Log the error if necessary - } - } - responseBean.setFieldValue(documentResponseBeans); - } else { - responseBean.setFieldValue(null); - } - - fileDetailResponses.add(responseBean); - } - - applicationAmendmentRequestResponse.setApplicationFormFields(fileDetailResponses); - - return applicationAmendmentRequestResponse; + return response; } - public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long id) { + private ApplicationAmendmentRequestResponse initializeBasicResponse(ApplicationAmendmentRequestEntity entity) { + ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); + response.setId(entity.getId()); + response.setApplicationId(entity.getApplicationId()); + response.setApplicationEvaluationId(entity.getApplicationEvaluationEntity().getId()); + response.setNote(entity.getNote()); + response.setStatus(ApplicationAmendmentRequestEnum.valueOf(entity.getStatus())); + response.setResponseDays(entity.getResponseDays()); + response.setInternalNote(entity.getInternalNote()); + + LocalDateTime startDate = entity.getStartDate(); + response.setStartDate(startDate); + response.setExpirationDate(startDate.plus(expirationDays, ChronoUnit.DAYS)); + response.setIsSendEmail(entity.getIsEmail()); + response.setIsSendNotification(entity.getIsNotification()); + + ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId()); + response.setCallEmail(application.getCall().getEmail()); + response.setCallName(application.getCall().getName()); + + UserEntity userEntity = userService.validateUser(application.getUserId()); + response.setBeneficiaryName(buildBeneficiaryName(userEntity)); + + Long protocolNumber = entity.getProtocol() != null ? entity.getProtocol().getProtocolNumber() : null; + response.setProtocolNumber(protocolNumber); + + return response; + } + + private Map extractFieldIdToLabelMap(List forms) { + return forms.stream() + .flatMap(form -> { + String content = form.getForm().getContent(); + return getIdAndLabelFromResult(filterByName(content, "fileupload")).stream(); + }) + .collect(Collectors.toMap(AmendmentFormFieldResponse::getFieldId, AmendmentFormFieldResponse::getLabel)); + } + + private Map getApplicationFormFieldEntityMap( + ApplicationAmendmentRequestEntity entity, List amendmentFormFields) { + List fieldIds = amendmentFormFields.stream() + .map(AmendmentFormField::getFieldId) + .toList(); + return getApplicationFormFieldList(entity, fieldIds).stream() + .collect(Collectors.toMap(ApplicationFormFieldEntity::getFieldId, Function.identity())); + } + + private void processFormFields(List amendmentFormFields, Map fieldIdToLabelMap, + Map formFieldEntityMap, ApplicationAmendmentRequestResponse response) { + List formFields = new ArrayList<>(); + List fileDetails = new ArrayList<>(); + + for (AmendmentFormField amendmentFormField : amendmentFormFields) { + // Create form field response + createFormField(formFields, fieldIdToLabelMap, amendmentFormField); + + // Create document responses + List documentIds = extractIds(amendmentFormField.getFieldValue()); + List documentResponseBeans = documentIds.stream() + .map(id -> { + DocumentEntity documentEntity = documentService.validateDocument(id); + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + return responseBean; + }) + .toList(); + + // Map to application form field response bean + ApplicationFormFieldEntity formFieldEntity = formFieldEntityMap.get(amendmentFormField.getFieldId()); + ApplicationFormFieldResponseBean responseBean = new ApplicationFormFieldResponseBean(); + responseBean.setApplicationFormId(formFieldEntity.getApplicationForm().getId()); + responseBean.setId(formFieldEntity.getId()); + responseBean.setFieldId(amendmentFormField.getFieldId()); + responseBean.setCreatedDate(formFieldEntity.getCreatedDate()); + responseBean.setUpdatedDate(formFieldEntity.getUpdatedDate()); + responseBean.setFieldValue(documentResponseBeans); + + fileDetails.add(responseBean); + } + + response.setFormFields(formFields); + response.setApplicationFormFields(fileDetails); + } + + private String buildBeneficiaryName(UserEntity userEntity) { + if (userEntity.getBeneficiary() == null) { + return ""; + } + String firstName = userEntity.getBeneficiary().getFirstName(); + String lastName = userEntity.getBeneficiary().getLastName(); + return (firstName != null ? firstName : "") + + (lastName != null && !lastName.isBlank() ? " " + lastName : ""); + } + + + private void createFormField(List formFields, Map fieldIdToLabelMap, + AmendmentFormField amendmentFormField) { + AmendmentFormFieldResponse formField = new AmendmentFormFieldResponse(); + String label = fieldIdToLabelMap.get(amendmentFormField.getFieldId()); + formField.setFieldId(amendmentFormField.getFieldId()); + formField.setLabel(label); + formField.setSelected(true); + formFields.add(formField); + } + + + public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long id) { return applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); @@ -447,196 +454,318 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote()); - if (updateRequest.getApplicationFormFields() != null) { - updateApplicationFormFields(existingApplicationAmendment, updateRequest.getApplicationFormFields()); - updateFormFieldsJson(existingApplicationAmendment, updateRequest.getApplicationFormFields()); - } - existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - + + Map amendmentFormFieldMap = Utils + .convertJsonStringToList(existingApplicationAmendment.getFormFields(), AmendmentFormField.class) + .stream().collect(Collectors.toMap(AmendmentFormField::getFieldId, Function.identity())); + Map applicationFormFieldMap = getApplicationFormFieldList(existingApplicationAmendment, amendmentFormFieldMap.keySet().stream().toList()).stream().collect(Collectors.toMap(ApplicationFormFieldEntity::getFieldId, Function.identity())); + + updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{ + AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId()); + ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); + updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); + updateFormField(applicationFormFieldRequest, amendmentFormField); + }); + existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); + ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); log.info("Application Amendment updated successfully: {}", response); return response; } - private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { - if (updatedFormField.getFieldValue() == null || "".equals(updatedFormField.getFieldValue().toString().trim())) { - List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); + private List updateApplicationFormField(ApplicationFormFieldEntity applicationFormFieldEntity, + ApplicationFormFieldRequestBean applicationFormFieldRequest, AmendmentFormField amendmentFormField) { + // Step 1: Extract IDs + List applicationFormFieldIds = extractIds(applicationFormFieldEntity.getFieldValue()); + List amendmentFormFieldIds = extractIds(amendmentFormField.getFieldValue()); + List requestedIds = extractIds(applicationFormFieldRequest.getFieldValue()); - boolean fieldUpdated = false; + // Step 2: Optimize operations by finding differences + // Remove only those IDs from currentIds that exist in presentIds but not in requestedIds + List idsToRemove = amendmentFormFieldIds.stream() + .filter(id -> !requestedIds.contains(id)) + .toList(); + applicationFormFieldIds.removeAll(idsToRemove); - for (ApplicationFormEntity applicationForm : applicationForms) { - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); + // Add only those IDs to currentIds that exist in requestedIds but not in presentIds + List idsToAdd = requestedIds.stream() + .filter(id -> !amendmentFormFieldIds.contains(id)) + .toList(); + applicationFormFieldIds.addAll(idsToAdd); - if (formFieldEntityOptional.isPresent()) { - ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); - formEntity.setFieldValue(null); // Set field value to null - applicationFormFieldRepository.save(formEntity); - log.info("Set field value to null for application ID {} and field ID {}", applicationAmendment.getApplicationId(), updatedFormField.getFieldId()); - fieldUpdated = true; - break; - } - } + // Step 3: Update the applicationFormFieldEntity fieldValue with requestedIds if it has changed + if (!amendmentFormFieldIds.equals(requestedIds)) { + String updatedFieldValue = applicationFormFieldIds.stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + applicationFormFieldEntity.setFieldValue(updatedFieldValue); + applicationFormFieldRepository.save(applicationFormFieldEntity); + } - if (!fieldUpdated) { - throw new CustomValidationException(Status.NOT_FOUND, "No ApplicationFormField found for application ID " + applicationAmendment.getApplicationId() + " and field ID " + updatedFormField.getFieldId()); - } - return; - } - - List documentIds; - - if (updatedFormField.getFieldValue() instanceof String && updatedFormField.getFieldValue() != null) { - documentIds = Arrays.asList(((String) updatedFormField.getFieldValue()).split(",")); - } else { - log.warn("Expected fieldValue as a comma-separated String but got: {}", updatedFormField.getFieldValue()); - return; - } - - List validDocumentIds = new ArrayList<>(); - for (String documentId : documentIds) { - try { - DocumentEntity documentEntity = documentService.validateDocument(Long.parseLong(documentId.trim())); - if (documentEntity != null) { - validDocumentIds.add(documentId.trim()); - } else { - log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); - } - } catch (NumberFormatException e) { - log.error("Invalid document ID format: {}. Error: {}", documentId, e.getMessage()); - } - } - - if (!validDocumentIds.isEmpty()) { - List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); - - boolean fieldUpdated = false; - - // Parse the formFields JSON string to get amendment field values - String amendmentFieldValue = null; - try { - ObjectMapper mapper = new ObjectMapper(); - List amendmentFields = mapper.readValue( - applicationAmendment.getFormFields(), - mapper.getTypeFactory().constructCollectionType(List.class, ApplicationFormFieldRequestBean.class) - ); - - // Find the matching field value and convert to string if found - Optional amendmentFieldObj = amendmentFields.stream() - .filter(field -> updatedFormField.getFieldId().equals(field.getFieldId())) - .map(ApplicationFormFieldRequestBean::getFieldValue) - .findFirst(); - - if (amendmentFieldObj.isPresent() && amendmentFieldObj.get() instanceof String) { - amendmentFieldValue = (String) amendmentFieldObj.get(); - } - - } catch (JsonProcessingException e) { - log.error("Error parsing formFields JSON: {}", e.getMessage()); - return; - } - - if (amendmentFieldValue == null) { - log.warn("No matching field found in amendment for field ID {}", updatedFormField.getFieldId()); - return; - } - - List amendmentDocumentIds = Arrays.asList(amendmentFieldValue.split(",")); - - for (ApplicationFormEntity applicationForm : applicationForms) { - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); - - if (formFieldEntityOptional.isPresent()) { - ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); - - // Retrieve existing document IDs in ApplicationFormFieldTable - String existingFieldValue = formEntity.getFieldValue(); - Set existingDocumentIds = existingFieldValue != null - ? new HashSet<>(Arrays.asList(existingFieldValue.split(","))) - : new HashSet<>(); - - // Remove amendment documents from existing document IDs - existingDocumentIds.removeAll(amendmentDocumentIds); - - // Add valid new document IDs from the request - existingDocumentIds.addAll(validDocumentIds); - applicationDao.updateDocumentDeletionStatus(formEntity, updatedFormField, formEntity.getApplicationForm().getForm(), null,validDocumentIds,true); - // Set the combined document IDs back as the field value - formEntity.setFieldValue(String.join(",", existingDocumentIds)); - applicationFormFieldRepository.save(formEntity); - log.info("Updated field value for application ID {} and field ID {} with document IDs {}", - applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", existingDocumentIds)); - fieldUpdated = true; - break; - } - } - - if (!fieldUpdated) { - throw new CustomValidationException(Status.NOT_FOUND, - String.format("No ApplicationFormField found for application ID %s and field ID %s. Skipping update.", - applicationAmendment.getApplicationId(), updatedFormField.getFieldId())); - } - } else { - log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); - } - } + // Step 4: Return the updated currentIds + return applicationFormFieldIds; + + } - private void updateFormFieldsJson(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { - if (updatedFormField != null) { - try { - // Step 1: Fetch the existing form fields JSON - String existingFormFieldsJson = applicationAmendment.getFormFields(); - List formFieldsList; - - if (existingFormFieldsJson == null || existingFormFieldsJson.isEmpty()) { - formFieldsList = new ArrayList<>(); // If no existing data, start with an empty list - } else { - // Step 2: Deserialize the existing JSON into a list of objects - formFieldsList = new ObjectMapper().readValue(existingFormFieldsJson, new TypeReference>() { - }); - } - - // Step 3: Check if the field ID already exists in the list and update it - boolean fieldUpdated = false; - for (ApplicationFormFieldRequestBean field : formFieldsList) { - if (field.getFieldId().equals(updatedFormField.getFieldId())) { - field.setFieldValue(updatedFormField.getFieldValue()); // Update field value - fieldUpdated = true; - break; - } - } - - // If field wasn't updated, log a warning message instead of adding a new field - if (!fieldUpdated) { - log.warn("Field ID {} does not exist in the form fields for application amendment ID {}", updatedFormField.getFieldId(), applicationAmendment.getId()); - throw new CustomValidationException(Status.NOT_FOUND, "Field ID {} does not exist in the form fields for application amendment ID {}"); - - } - - // Step 4: Serialize the updated list back to JSON if the update was successful - String updatedFormFieldsJson = new ObjectMapper().writeValueAsString(formFieldsList); - applicationAmendment.setFormFields(updatedFormFieldsJson); // Update the form fields with the modified list - - log.info("Updated form fields JSON for application amendment ID {}: {}", applicationAmendment.getId(), updatedFormFieldsJson); - - } catch (JsonProcessingException e) { - log.error("Error processing JSON for form fields for application amendment ID {}: {}", applicationAmendment.getId(), e.getMessage()); - throw new CustomValidationException(Status.BAD_REQUEST, "Error processing JSON for form fields"); - } - } else { - log.warn("No form field data to update for application amendment ID {}", applicationAmendment.getId()); - throw new CustomValidationException(Status.NOT_FOUND, "No form field data to update for application amendment ID {}"); - } - } + private ApplicationFormFieldEntity getApplicationFormField( + Map applicationFormFieldMap, String fieldId) { + ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldMap.get(fieldId); + if (applicationFormFieldEntity == null) { + throw new CustomValidationException(Status.BAD_REQUEST, GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND); + } + return applicationFormFieldEntity; + } - public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryId) { - UserEntity userEntity = userService.validateUser(beneficiaryId); + private List getApplicationFormFieldList( + ApplicationAmendmentRequestEntity applicationAmendment, + List fieldIds) { + List applicationFormList = applicationFormRepository + .findByApplicationId(applicationAmendment.getApplicationId()); + + return applicationFormList.stream().flatMap(applicationForm -> applicationFormFieldRepository + .findByApplicationFormIdAndFieldIdIn(applicationForm.getId(), fieldIds).stream()).toList(); + } + + + private AmendmentFormField getAmendmentFormField(Map amendmentFormFieldMap, + String fieldId) { + AmendmentFormField amendmentFormField = amendmentFormFieldMap.get(fieldId); + if (amendmentFormField == null) { + throw new CustomValidationException(Status.BAD_REQUEST, GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND); + } + return amendmentFormField; + } + + + private void updateFormField(ApplicationFormFieldRequestBean applicationFormFieldRequest, + AmendmentFormField amendmentFormField) { + List requestedDocumentIds = extractIds(applicationFormFieldRequest.getFieldValue()); + List existingDocumentIds = extractIds(amendmentFormField.getFieldValue()); + + if (requestedDocumentIds.isEmpty()) { + if (!existingDocumentIds.isEmpty()) { + existingDocumentIds.forEach(this::softDeleteDocument); + amendmentFormField.setFieldValue(null); + setIsUploadedBy(amendmentFormField); + } + return; + } + + requestedDocumentIds.forEach(documentId -> documentService.validateDocument(documentId).getId()); + existingDocumentIds.stream().filter(documentId -> !requestedDocumentIds.contains(documentId)) + .forEach(this::softDeleteDocument); + + String newFieldValue = String.join(",", + requestedDocumentIds.stream().map(String::valueOf).collect(Collectors.toList())); + + if (!newFieldValue.equals(amendmentFormField.getFieldValue())) { + amendmentFormField.setFieldValue(newFieldValue); + setIsUploadedBy(amendmentFormField); + } + } + + private List extractIds(Object fieldValue) { + if (fieldValue instanceof String && !StringUtils.isEmpty((String) fieldValue)) { + return Arrays.stream(((String) fieldValue).split(",")) + .map(Long::valueOf) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + + + private void setIsUploadedBy(AmendmentFormField amendmentFormField) { + if(validator.checkIsBeneficiary()) { + amendmentFormField.setIsUploadedBy(AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); + }else { + amendmentFormField.setIsUploadedBy(AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); + } + + } + + +// private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { +// if (updatedFormField.getFieldValue() == null || "".equals(updatedFormField.getFieldValue().toString().trim())) { +// List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); +// +// boolean fieldUpdated = false; +// +// for (ApplicationFormEntity applicationForm : applicationForms) { +// Optional formFieldEntityOptional = applicationFormFieldRepository +// .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); +// +// if (formFieldEntityOptional.isPresent()) { +// ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); +// formEntity.setFieldValue(null); // Set field value to null +// applicationFormFieldRepository.save(formEntity); +// log.info("Set field value to null for application ID {} and field ID {}", applicationAmendment.getApplicationId(), updatedFormField.getFieldId()); +// fieldUpdated = true; +// break; +// } +// } +// +// if (!fieldUpdated) { +// throw new CustomValidationException(Status.NOT_FOUND, "No ApplicationFormField found for application ID " + applicationAmendment.getApplicationId() + " and field ID " + updatedFormField.getFieldId()); +// } +// return; +// } +// +// List documentIds; +// +// if (updatedFormField.getFieldValue() instanceof String && updatedFormField.getFieldValue() != null) { +// documentIds = Arrays.asList(((String) updatedFormField.getFieldValue()).split(",")); +// } else { +// log.warn("Expected fieldValue as a comma-separated String but got: {}", updatedFormField.getFieldValue()); +// return; +// } +// +// List validDocumentIds = new ArrayList<>(); +// for (String documentId : documentIds) { +// try { +// DocumentEntity documentEntity = documentService.validateDocument(Long.parseLong(documentId.trim())); +// if (documentEntity != null) { +// validDocumentIds.add(documentId.trim()); +// } else { +// log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); +// } +// } catch (NumberFormatException e) { +// log.error("Invalid document ID format: {}. Error: {}", documentId, e.getMessage()); +// } +// } +// +// if (!validDocumentIds.isEmpty()) { +// List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); +// +// boolean fieldUpdated = false; +// +// // Parse the formFields JSON string to get amendment field values +// String amendmentFieldValue = null; +// try { +// ObjectMapper mapper = new ObjectMapper(); +// List amendmentFields = mapper.readValue( +// applicationAmendment.getFormFields(), +// mapper.getTypeFactory().constructCollectionType(List.class, ApplicationFormFieldRequestBean.class) +// ); +// +// // Find the matching field value and convert to string if found +// Optional amendmentFieldObj = amendmentFields.stream() +// .filter(field -> updatedFormField.getFieldId().equals(field.getFieldId())) +// .map(ApplicationFormFieldRequestBean::getFieldValue) +// .findFirst(); +// +// if (amendmentFieldObj.isPresent() && amendmentFieldObj.get() instanceof String) { +// amendmentFieldValue = (String) amendmentFieldObj.get(); +// } +// +// } catch (JsonProcessingException e) { +// log.error("Error parsing formFields JSON: {}", e.getMessage()); +// return; +// } +// +// if (amendmentFieldValue == null) { +// log.warn("No matching field found in amendment for field ID {}", updatedFormField.getFieldId()); +// return; +// } +// +// List amendmentDocumentIds = Arrays.asList(amendmentFieldValue.split(",")); +// +// for (ApplicationFormEntity applicationForm : applicationForms) { +// Optional formFieldEntityOptional = applicationFormFieldRepository +// .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); +// +// if (formFieldEntityOptional.isPresent()) { +// ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); +// +// // Retrieve existing document IDs in ApplicationFormFieldTable +// String existingFieldValue = formEntity.getFieldValue(); +// Set existingDocumentIds = existingFieldValue != null +// ? new HashSet<>(Arrays.asList(existingFieldValue.split(","))) +// : new HashSet<>(); +// +// // Remove amendment documents from existing document IDs +// existingDocumentIds.removeAll(amendmentDocumentIds); +// +// // Add valid new document IDs from the request +// existingDocumentIds.addAll(validDocumentIds); +// applicationDao.updateDocumentDeletionStatus(formEntity, updatedFormField, formEntity.getApplicationForm().getForm(), null,validDocumentIds,true); +// // Set the combined document IDs back as the field value +// formEntity.setFieldValue(String.join(",", existingDocumentIds)); +// applicationFormFieldRepository.save(formEntity); +// log.info("Updated field value for application ID {} and field ID {} with document IDs {}", +// applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", existingDocumentIds)); +// fieldUpdated = true; +// break; +// } +// } +// +// if (!fieldUpdated) { +// throw new CustomValidationException(Status.NOT_FOUND, +// String.format("No ApplicationFormField found for application ID %s and field ID %s. Skipping update.", +// applicationAmendment.getApplicationId(), updatedFormField.getFieldId())); +// } +// } else { +// log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); +// } +// } +// +// +// private void updateFormFieldsJson(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { +// if (updatedFormField != null) { +// try { +// // Step 1: Fetch the existing form fields JSON +// String existingFormFieldsJson = applicationAmendment.getFormFields(); +// List formFieldsList; +// +// if (existingFormFieldsJson == null || existingFormFieldsJson.isEmpty()) { +// formFieldsList = new ArrayList<>(); // If no existing data, start with an empty list +// } else { +// // Step 2: Deserialize the existing JSON into a list of objects +// formFieldsList = new ObjectMapper().readValue(existingFormFieldsJson, new TypeReference>() { +// }); +// } +// +// // Step 3: Check if the field ID already exists in the list and update it +// boolean fieldUpdated = false; +// for (ApplicationFormFieldRequestBean field : formFieldsList) { +// if (field.getFieldId().equals(updatedFormField.getFieldId())) { +// field.setFieldValue(updatedFormField.getFieldValue()); // Update field value +// fieldUpdated = true; +// break; +// } +// } +// +// // If field wasn't updated, log a warning message instead of adding a new field +// if (!fieldUpdated) { +// log.warn("Field ID {} does not exist in the form fields for application amendment ID {}", updatedFormField.getFieldId(), applicationAmendment.getId()); +// throw new CustomValidationException(Status.NOT_FOUND, "Field ID {} does not exist in the form fields for application amendment ID {}"); +// +// } +// +// // Step 4: Serialize the updated list back to JSON if the update was successful +// String updatedFormFieldsJson = new ObjectMapper().writeValueAsString(formFieldsList); +// applicationAmendment.setFormFields(updatedFormFieldsJson); // Update the form fields with the modified list +// +// log.info("Updated form fields JSON for application amendment ID {}: {}", applicationAmendment.getId(), updatedFormFieldsJson); +// +// } catch (JsonProcessingException e) { +// log.error("Error processing JSON for form fields for application amendment ID {}: {}", applicationAmendment.getId(), e.getMessage()); +// throw new CustomValidationException(Status.BAD_REQUEST, "Error processing JSON for form fields"); +// } +// } else { +// log.warn("No form field data to update for application amendment ID {}", applicationAmendment.getId()); +// throw new CustomValidationException(Status.NOT_FOUND, "No form field data to update for application amendment ID {}"); +// } +// } + + + public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryUserId) { + UserEntity userEntity = userService.validateUser(beneficiaryUserId); List entities = - applicationAmendmentRequestRepository.findByUserId(beneficiaryId); + applicationAmendmentRequestRepository.findByUserId(beneficiaryUserId); return entities.stream() .map(this::convertEntityToResponse) @@ -779,4 +908,9 @@ public class ApplicationAmendmentRequestDao { } + private void softDeleteDocument(Long documentId) { + documentService.deleteFile(documentId); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 6f8e3243..71655909 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -118,7 +118,7 @@ public class DocumentDao { public DocumentEntity validateDocument(Long id) { - return documentRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + return documentRepository.findByIdAndNotDeleted(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java new file mode 100644 index 00000000..95f158c3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java @@ -0,0 +1,33 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonValue; + +import lombok.Data; + +@Data +public class AmendmentFormField { + + private String fieldId; + + private String fieldValue; + + private String isUploadedBy; + + + public enum AmendmentIsUploadedByEnum { + PRE_INSTRUCTOR("PRE_INSTRUCTOR"), + BENEFICIARY("BENEFICIARY"); + + private String value; + + AmendmentIsUploadedByEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index c3c5aeb5..94141ef0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -1,9 +1,11 @@ package net.gepafin.tendermanagement.model.request; +import java.util.List; + import lombok.Data; @Data public class ApplicationAmendmentRequestBean { private String note; - private ApplicationFormFieldRequestBean applicationFormFields; + private List applicationFormFields; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java index b989e2dd..7a2652ad 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -38,4 +38,6 @@ public interface ApplicationFormFieldRepository extends JpaRepository findByApplicationFormIdAndFieldId(Long id, String fieldId); + + public List findByApplicationFormIdAndFieldIdIn(Long id, List fieldIds); } 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 1f6f2f84..4d3092a3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -87,13 +87,12 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm @Override public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { - ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); - Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); - if (entityOptional.isPresent()) { - UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, amendment.getApplicationEvaluationEntity().getUserId()); + } else { + validator.validateUserId(request, amendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); } return applicationAmendmentRequestDao.updateApplicationAmendment(id,applicationAmendmentRequestBean); } @@ -105,9 +104,9 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override - public List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) { + public List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryUserId) { UserEntity user= validator.validateUser(request); - return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryId); + return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryUserId); } @Override 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 651680ff..0918b918 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 @@ -115,7 +115,7 @@ public interface ApplicationAmendmentRequestApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/beneficiary/user/{id}", produces = "application/json") ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, - @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); + @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryUserId); @Operation(summary = "Api to extend response days for an amendment request", responses = { @ApiResponse(responseCode = "200", description = "OK"), 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 bd66efd1..5bf3234e 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 @@ -76,9 +76,9 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme } @Override - public ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) { + public ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryUserId) { log.info("Get All Application Amendment Request By Beneficiary ID"); - List applicationAmendmentRequestResponseList = applicationAmendmentRequestService.getAllAmendmentRequestByBeneficiaryId(request, beneficiaryId); + List applicationAmendmentRequestResponseList = applicationAmendmentRequestService.getAllAmendmentRequestByBeneficiaryId(request, beneficiaryUserId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } From bb34972c044b5187a098d25f8ce858a7ac15a01d Mon Sep 17 00:00:00 2001 From: rajesh Date: Sun, 24 Nov 2024 22:03:15 +0530 Subject: [PATCH 24/27] removed code smells --- .../dao/ApplicationAmendmentRequestDao.java | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 45d6fdb3..8f7fe151 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.criteria.Join; @@ -33,7 +32,6 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.function.Function; -import java.util.stream.Collector; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.log; @@ -85,21 +83,11 @@ public class ApplicationAmendmentRequestDao { @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; - @Autowired - private CallDao callDao; - - @Autowired - private DocumentRepository documentRepository; - @Autowired private HubService hubService; -// @Autowired -// private MailUtil mailUtil; @Autowired private Validator validator; - @Autowired - private ApplicationDao applicationDao; @Autowired private EmailLogDao emailLogDao; @@ -460,13 +448,15 @@ public class ApplicationAmendmentRequestDao { .stream().collect(Collectors.toMap(AmendmentFormField::getFieldId, Function.identity())); Map applicationFormFieldMap = getApplicationFormFieldList(existingApplicationAmendment, amendmentFormFieldMap.keySet().stream().toList()).stream().collect(Collectors.toMap(ApplicationFormFieldEntity::getFieldId, Function.identity())); - updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{ - AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId()); - ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); - updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); - updateFormField(applicationFormFieldRequest, amendmentFormField); - }); - existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); + if(updateRequest.getApplicationFormFields() != null) { + updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{ + AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId()); + ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); + updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); + updateFormField(applicationFormFieldRequest, amendmentFormField); + }); + existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); + } ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); From 24a1bc024f7060511822bb5962c518f31fc92ed1 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 25 Nov 2024 11:21:56 +0530 Subject: [PATCH 25/27] updated code --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 8f7fe151..c2054ef3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -833,9 +833,9 @@ public class ApplicationAmendmentRequestDao { public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus( Long id, ApplicationAmendmentRequestEnum statusTypeEnum) { - log.info("Updating application amendement with status: {}", id); + log.info("Updating application amendment with status: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); - if (Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))) { + if (Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) || Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))) { existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationAmendmentRequestRepository.save(existingApplicationAmendment); From bc11a40723b2c356040d8c23ce081285149761c3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 25 Nov 2024 12:57:05 +0530 Subject: [PATCH 26/27] Fix issue related to senderUserId and receiverUserId --- .../tendermanagement/dao/CommunicationDao.java | 2 +- .../model/response/CommunicationResponseBean.java | 12 ++++++++++++ .../repositories/CommunicationRepository.java | 5 +++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index 75926512..b752a755 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -58,7 +58,7 @@ public class CommunicationDao { public ApplicationAmendmentResponse getAmendmentComments(Long amendmentId) { ApplicationAmendmentRequestEntity amendmentData = applicationAmendmentRequestService.validateApplicationAmendmentRequest(amendmentId); - List commentsList = communicationRepository.findCommentDetailsByAmendmentId(amendmentId); + List commentsList = communicationRepository.findCommentListDetailsByAmendmentId(amendmentId); if (commentsList == null) { throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java index 13afde4b..4593db84 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java @@ -31,6 +31,18 @@ public class CommunicationResponseBean { this.amendmentId = amendmentId; } + public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId,Long senderUserId,Long receiverUserId) { + + this.commentedDate = commentedDate; + this.comment = comment; + this.title = title; + this.createdDate = createdDate; + this.updatedDate = updatedDate; + this.amendmentId = amendmentId; + this.senderUserId = senderUserId; + this.receiverUserId = receiverUserId; + } + public CommunicationResponseBean() { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java index 0e9d8d9c..f92b9a06 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java @@ -15,7 +15,8 @@ public interface CommunicationRepository extends JpaRepository findCommentsByApplicationAmendmentRequestId(@Param("applicationAmendmentRequestId") Long amendmentRequestId); @Query("SELECT new net.gepafin.tendermanagement.model.response.CommunicationResponseBean( " + "c.commentedDate, c.communicationComment, c.communicationTitle, c.createdDate, c" + - ".updatedDate, c.applicationAmendmentRequest.id) " + "FROM CommunicationEntity c " + "WHERE c.applicationAmendmentRequest.id = :amendmentId AND c.isDeleted = false") - List findCommentDetailsByAmendmentId(@Param("amendmentId") Long amendmentId); + ".updatedDate, c.applicationAmendmentRequest.id,c.senderUserId, c.receiverUserId) " + "FROM CommunicationEntity c " + "WHERE c.applicationAmendmentRequest.id = :amendmentId AND c.isDeleted = false") + List findCommentListDetailsByAmendmentId(@Param("amendmentId") Long amendmentId); + } From 04aaa23c2cddb5c50a4540fcaa6d18332fbeb834 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 25 Nov 2024 15:20:10 +0530 Subject: [PATCH 27/27] updated code for document --- .../java/net/gepafin/tendermanagement/dao/DocumentDao.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 71655909..4f0f3144 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -109,7 +109,8 @@ public class DocumentDao { } public void deleteFile(Long documentId) { - DocumentEntity documentEntity = validateDocument(documentId); + DocumentEntity documentEntity = documentRepository.findById(documentId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); // String fileName= Utils.extractFileName(documentEntity.getFilePath()); // deleteFileOnAmazonS3(fileName); documentEntity.setIsDeleted(true);