Done ticket GEPAFINBE-6141

This commit is contained in:
rajesh
2025-11-11 15:23:40 +05:30
parent 98cdda457d
commit 05c3c95b65
19 changed files with 291 additions and 187 deletions

View File

@@ -8,7 +8,7 @@ import java.util.List;
public interface PecMailService {
public PecMailResponse sendPecMail(HttpServletRequest request, List<Long> userActionIds);
public List<PecMailResponse> sendPecMail(HttpServletRequest request, List<Long> userActionIds);
public List<PecEmailLogResponse> getEmailLogByUserActionId(HttpServletRequest request, Long userActionId);

View File

@@ -1,12 +1,13 @@
package net.gepafin.tendermanagement.service.impl;
import net.gepafin.tendermanagement.entities.EmailLogEntity;
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<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest);
void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogEntity emailLogEntity,Boolean isSendEmail);
}

View File

@@ -8,6 +8,8 @@ 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.repositories.EmailLogRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
@@ -15,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.List;
@@ -30,8 +33,11 @@ public class MailgunEmailService implements EmailService {
@Autowired
private EmailLogDao emailLogDao;
@Autowired
private EmailLogRepository emailLogRepository;
@Override
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) {
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogEntity emailLogEntity,Boolean isSendEmail) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) {
return;
@@ -45,10 +51,8 @@ public class MailgunEmailService implements EmailService {
// Send email via Mailgun API
HttpResponse<String> response2=null;
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
emailLogRequest.setEmailSubject(subject);
emailLogRequest.setEmailBody(body);
emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails));
emailLogEntity.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
emailLogEntity.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails));
try {
Unirest.setTimeouts(0, 0);
response2 = Unirest.post(url)
@@ -60,16 +64,17 @@ public class MailgunEmailService implements EmailService {
.field("html", body)
.asString();
}catch(Exception e) {
emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue());
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());
emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE.getValue());
emailLogEntity.setErrorMessage(e.getMessage());
emailLogRepository.save(emailLogEntity);
throw new RuntimeException("Failed to send email via Mailgun: " + response2.getStatus());
}
emailLogRequest.setEmailServiceResponse(response2.getBody());
emailLogEntity.setEmailServiceResponse(response2.getBody());
}
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE);
EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest);
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.MAILGUN_SERVICE.getValue());
emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
emailLogRepository.save(emailLogEntity);
}
}

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.service.impl;
import com.amazonaws.services.s3.AmazonS3Client;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mashape.unirest.http.HttpResponse;
@@ -9,14 +10,18 @@ import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.dao.ApplicationDao;
import net.gepafin.tendermanagement.dao.EmailLogDao;
import net.gepafin.tendermanagement.dao.NotificationDao;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.EmailLogEntity;
import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum;
import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum;
import net.gepafin.tendermanagement.enums.NotificationTypeEnum;
import net.gepafin.tendermanagement.enums.StatusTypeEnum;
import net.gepafin.tendermanagement.model.request.EmailConfig;
import net.gepafin.tendermanagement.model.request.EmailLogRequest;
import net.gepafin.tendermanagement.model.request.NotificationReq;
import net.gepafin.tendermanagement.model.request.PecEmailRequest;
import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.repositories.EmailLogRepository;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.S3DocxProcessor;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
@@ -25,6 +30,9 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -51,65 +59,109 @@ public class PecEmailService implements EmailService {
@Autowired
private ApplicationDao applicationDao;
@Autowired
private CompanyService companyService;
@Autowired
private AmazonS3Client s3Client;
@Autowired
private EmailLogRepository emailLogRepository;
@Override
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) {
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogEntity emailLogEntity, Boolean isSendEmail) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) {
return;
}
if(Boolean.TRUE.equals(isSendEmail)) {
Map<String, String> replacements=new HashMap<>();
List<AttachmentRequest> attachmentRequests =new ArrayList<>();
S3DocxProcessor processor = new S3DocxProcessor(s3Client);
List<String> urls = Utils.convertJsonStringToList(emailLogEntity.getAttachments(), String.class);
PecEmailRequest emailRequest = new PecEmailRequest();
emailRequest.setSender(emailConfig.getSender());
emailRequest.setSubject(subject);
emailRequest.setBody(body);
emailRequest.setUsername(emailConfig.getUsername());
emailRequest.setPassword(emailConfig.getPassword());
emailRequest.setAttachments(emailLogRequest.getAttachments());
emailRequest.setRecipient(recipientEmails);
String url=emailConfig.getUrl()+ GepafinConstant.PEC_SERVICE_SEND_MAIL;
String authToken = emailConfig.getAuthToken();
HttpResponse<String> 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 {
if (Boolean.TRUE.equals(Boolean.parseBoolean(isPecServiceEnabled))) {
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();
if(emailLogEntity.getEmailType().equals(EmailScenarioTypeEnum.SPECIAL_APPLICATION_AMENDMENT_REQUESTED.getValue())) {
ApplicationEntity applicationEntity = applicationDao.validateApplication(emailLogEntity.getApplicationId());
CompanyEntity company = companyService.validateCompany(applicationEntity.getCompanyId());
String amount = Utils.convertToItalianFormat(String.valueOf(applicationEntity.getAmountAccepted()));
String protocolNumber = applicationEntity.getProtocol().getExternalProtocolNumber();
if (protocolNumber == null) {
protocolNumber = String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
replacements = Map.of(
"{call_name}", applicationEntity.getCall().getName(),
"{amount_accepted}", amount,
"{pec}", "bandi.gepafin@legalmail.it",
"{company_name}", company.getCompanyName(),
"{protocol_number}", protocolNumber
);
}
if (urls!=null && Boolean.FALSE.equals(urls.isEmpty())) {
Map<String, AttachmentRequest> processedFiles = null;
try {
processedFiles = processor.processFiles(urls, replacements);
} catch (IOException e) {
throw new RuntimeException(e);
}
for (Map.Entry<String, AttachmentRequest> entry : processedFiles.entrySet()) {
AttachmentRequest attachmentRequest = new AttachmentRequest();
attachmentRequest.setName(entry.getKey()); // e.g. "path/file1.docx"
attachmentRequest.setFile(entry.getValue().getFile()); // updated file content
attachmentRequests.add(attachmentRequest);
}
}
PecEmailRequest emailRequest = new PecEmailRequest();
emailRequest.setSender(emailConfig.getSender());
emailRequest.setSubject(subject);
emailRequest.setBody(body);
emailRequest.setUsername(emailConfig.getUsername());
emailRequest.setPassword(emailConfig.getPassword());
emailRequest.setAttachments(attachmentRequests);
emailRequest.setRecipient(recipientEmails);
String url = emailConfig.getUrl() + GepafinConstant.PEC_SERVICE_SEND_MAIL;
String authToken = emailConfig.getAuthToken();
HttpResponse<String> response2 = null;
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
emailLogEntity.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
emailLogEntity.setRecipientEmails(Utils.listToCommaSeparatedString(emailRequest.getRecipient()));
try {
if (Boolean.TRUE.equals(Boolean.parseBoolean(isPecServiceEnabled))) {
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();
if (!isSuccessfulPecResponse(response2.getBody())) {
String errorMsg = "PEC sending failed: " + response2.getBody();
emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE);
emailLogRequest.setErrorMessage(errorMsg);
sendNotificationOnFailure(emailLogRequest.getUserId(),emailLogRequest.getEmailType());
if (!isSuccessfulPecResponse(response2.getBody())) {
String errorMsg = "PEC sending failed: " + response2.getBody();
emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE.getValue());
emailLogEntity.setErrorMessage(errorMsg);
sendNotificationOnFailure(emailLogEntity.getUserId(), EmailScenarioTypeEnum.valueOf(emailLogEntity.getEmailType()));
if (EmailScenarioTypeEnum.SPECIAL_APPLICATION_AMENDMENT_REQUESTED.equals(emailLogRequest.getEmailType())) {
applicationDao.sendApplicationSubmissionFailureEmail(emailLogRequest);
if (EmailScenarioTypeEnum.APPLICATION_SUBMITTED.getValue().equals(emailLogEntity.getEmailType())) {
applicationDao.sendApplicationSubmissionFailureEmail(emailLogEntity);
}
}
}
} catch (Exception e) {
emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE.getValue());
emailLogEntity.setErrorMessage(e.getMessage());
sendNotificationOnFailure(emailLogEntity.getUserId(), EmailScenarioTypeEnum.valueOf(emailLogEntity.getEmailType()));
if (EmailScenarioTypeEnum.APPLICATION_SUBMITTED.getValue().equals(emailLogEntity.getEmailType())) {
applicationDao.sendApplicationSubmissionFailureEmail(emailLogEntity);
}
}
}catch(Exception e) {
emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE);
emailLogRequest.setErrorMessage(e.getMessage());
sendNotificationOnFailure(emailLogRequest.getUserId(),emailLogRequest.getEmailType());
if (EmailScenarioTypeEnum.SPECIAL_APPLICATION_AMENDMENT_REQUESTED.equals(emailLogRequest.getEmailType())) {
applicationDao.sendApplicationSubmissionFailureEmail(emailLogRequest);
if (response2 != null) {
emailLogEntity.setEmailServiceResponse(response2.getBody());
}
}
if(response2 != null) {
emailLogRequest.setEmailServiceResponse(response2.getBody());
}
}
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE);
emailLogDao.createEmailLog(emailLogRequest);
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE.getValue());
emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
emailLogRepository.save(emailLogEntity);
}
private void sendNotificationOnFailure(Long userId, EmailScenarioTypeEnum emailScenarioTypeEnum) {

View File

@@ -17,7 +17,7 @@ public class PecMailSerivceImpl implements PecMailService {
private PecMailDao pecMailDao;
@Override
public PecMailResponse sendPecMail(HttpServletRequest request, List<Long> userActionIds) {
public List<PecMailResponse> sendPecMail(HttpServletRequest request, List<Long> userActionIds) {
return pecMailDao.sendPecMail(request,userActionIds);
}

View File

@@ -9,6 +9,8 @@ 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.repositories.EmailLogRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import org.slf4j.Logger;
@@ -17,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@Component
@@ -43,42 +46,46 @@ public class SystemEmailService implements EmailService {
@Autowired
private EmailLogDao emailLogDao;
@Autowired
private EmailLogRepository emailLogRepository;
public final Logger log = LoggerFactory.getLogger(SystemEmailService.class);
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogRequest emailLogRequest) {
public void sendEmail(String subject, String body, List<String> recipientEmails, EmailConfig emailConfig, EmailLogEntity emailLogEntity,Boolean isSendEmail) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) {
return;
}
if (Boolean.TRUE.equals(isSendEmail)) {
emailLogEntity.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
emailLogEntity.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails));
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE.getValue());
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
MessageResponse response = null;
try {
MailgunMessagesApi mailgunMessagesApi = MailgunClient.config(mailGunBaseUrl, mailGunApiKey).createApi(MailgunMessagesApi.class);
emailLogRequest.setEmailSubject(subject);
emailLogRequest.setEmailBody(body);
emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue());
emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails));
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE);
if (Boolean.FALSE.equals(validator.isTestProfileActivated())) {
MessageResponse response = null;
try {
MailgunMessagesApi mailgunMessagesApi = MailgunClient.config(mailGunBaseUrl, mailGunApiKey).createApi(MailgunMessagesApi.class);
String mailFrom = mailGunUser;
com.mailgun.model.message.Message message = com.mailgun.model.message.Message.builder().from(mailFrom).to(recipientEmails).subject(subject).html(body).build();
String mailFrom = mailGunUser;
com.mailgun.model.message.Message message = com.mailgun.model.message.Message.builder().from(mailFrom).to(recipientEmails).subject(subject).html(body).build();
response = mailgunMessagesApi.sendMessage(mailGunDomainName, message);
} catch (Exception e) {
emailLogEntity.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE.getValue());
emailLogEntity.setErrorMessage(e.getMessage());
emailLogRepository.save(emailLogEntity);
throw new RuntimeException("Failed to send email via Mailgun: " + (response != null ? response.getMessage() : "No response from Mailgun"), e);
}
if (response != null) {
emailLogEntity.setEmailServiceResponse(response.toString());
}
response = mailgunMessagesApi.sendMessage(mailGunDomainName, message);
} catch (Exception e) {
emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue());
emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE);
emailLogRequest.setErrorMessage(e.getMessage());
emailLogDao.createEmailLog(emailLogRequest);
throw new RuntimeException("Failed to send email via Mailgun: " + (response != null ? response.getMessage() : "No response from Mailgun"), e);
}
if(response != null) {
emailLogRequest.setEmailServiceResponse(response.toString());
}
emailLogDao.createEmailLog(emailLogRequest);
}
emailLogEntity.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE.getValue());
emailLogEntity.setSendDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
emailLogRepository.save(emailLogEntity);
}
}