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 net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum; import net.gepafin.tendermanagement.enums.StatusTypeEnum; import net.gepafin.tendermanagement.entities.*; 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.EmailLogRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.impl.EmailService; import net.gepafin.tendermanagement.service.impl.EmailServiceFactory; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.*; @Component public class EmailNotificationDao { private static final Logger log = LoggerFactory.getLogger(EmailNotificationDao.class); @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; @Autowired private ApplicationService applicationService; @Autowired private UserService userService; @Autowired private HubService hubService; @Autowired EmailServiceFactory emailServiceFactory; @Autowired HubRepository hubRepository; @Autowired private EmailLogDao emailLogDao; @Autowired private EmailLogRepository emailLogRepository; private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, Map bodyPlaceholders, List additionalRecipients,Long amendmentId) { HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); String service = determineService(applicationEntity.getHubId()); String legalMail = service.equals("Gepafin S.p.a.") ? "bandi.gepafin@legalmail.it" : "bandi.sviluppumbria@legalmail.it"; SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, hubEntity, null); Map subjectPlaceholders = new HashMap<>(); subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); bodyPlaceholders.put("{{legal_mail}}", legalMail); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); 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) { List recipientEmails = new ArrayList<>(); String companyEmail = applicationEntity.getCompany().getEmail(); String contactEmail = applicationEntity.getCompany().getContactEmail(); if (companyEmail != null && !companyEmail.isEmpty()) { recipientEmails.add(companyEmail); } if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { recipientEmails.add(contactEmail); } if (userEntity.getBeneficiary().getEmail() != null) { recipientEmails.add(userEntity.getBeneficiary().getEmail()); } if (additionalRecipients != null) { recipientEmails.addAll(additionalRecipients); } return recipientEmails; } private String determineService(Long hubId) { HubEntity hub = hubRepository.findById(hubId).orElseThrow(() -> new IllegalArgumentException("Invalid Hub ID: " + hubId)); return hub.getEmailServiceType().equalsIgnoreCase("MAILGUN_SERVICE") ? "Gepafin S.p.a." : "Sviluppumbria"; } public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{protocol_number}}", applicationAmendmentRequest.getProtocol().getProtocolNumber().toString()); bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); String formFieldsJson = applicationAmendmentRequest.getFormFields(); ObjectMapper objectMapper = new ObjectMapper(); try { List> formFields = objectMapper.readValue(formFieldsJson, new TypeReference>>() { }); //• StringBuilder bulletPoints = new StringBuilder(); for (Map field : formFields) { String label = (String) field.get("label"); boolean selected = (boolean) field.get("selected"); if (!selected) { bulletPoints.append("• ").append(label).append("\n"); } } bodyPlaceholders.put("{{form_dataInput}}", bulletPoints.toString()); } catch (Exception e) { log.error("Failed to parse form fields JSON: ", e); } bodyPlaceholders.put("{{note}}", applicationAmendmentRequest.getNote()); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null,applicationAmendmentRequest.getId()); } 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()); LocalDateTime lastReminderDateTime=amendmentRequest.getCreatedDate(); 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,amendmentRequest.getId()); } public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); 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,null); } public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); 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,null); } 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,emailLogRequest); } public EmailConfig retrieveEmailConfig(Long hubId) { HubEntity hubEntity = hubRepository.findById(hubId).orElseThrow(() -> new IllegalArgumentException("Invalid Hub ID: " + hubId)); String emailServiceType = hubEntity.getEmailServiceType(); String encryptedConfigJson = hubEntity.getEmailServiceConfig(); String decryptedConfigJson = Utils.decryptCredential(encryptedConfigJson); EmailConfig emailConfig = parseEmailConfig(decryptedConfigJson); emailConfig.setEmailServiceType(emailServiceType); return emailConfig; } private EmailConfig parseEmailConfig(String configJson) { ObjectMapper objectMapper = new ObjectMapper(); try { return objectMapper.readValue(configJson, EmailConfig.class); } catch (JsonProcessingException e) { throw new IllegalArgumentException("Failed to parse email configuration JSON", e); } } }