Resolved conflict

This commit is contained in:
rajesh
2025-07-24 16:28:57 +05:30
106 changed files with 3023 additions and 1434 deletions

View File

@@ -18,7 +18,7 @@ public class AppointmentApiConstant {
public static final boolean CREA_ANAGRAFICA = Boolean.TRUE; public static final boolean CREA_ANAGRAFICA = Boolean.TRUE;
public static final boolean SALVA_DOCUMENTI = Boolean.TRUE; public static final boolean SALVA_DOCUMENTI = Boolean.TRUE;
public static final String VISURA_PROVIDER = "cerved"; public static final String VISURA_PROVIDER = "cerved";
public static final String VISURA_TYPE = "StandardReport"; public static final String VISURA_TYPE = "FullReport";
public static final String VISURA_MODE = "visure"; public static final String VISURA_MODE = "visure";
public static final String COD_AGENTE = "UtenzaAPIPortal"; public static final String COD_AGENTE = "UtenzaAPIPortal";
public static final boolean IS_FROM_RATING = Boolean.FALSE; public static final boolean IS_FROM_RATING = Boolean.FALSE;
@@ -38,4 +38,7 @@ public class AppointmentApiConstant {
public static final String COD_OPERAZIONE = "codOperazione"; public static final String COD_OPERAZIONE = "codOperazione";
public static final String MOTIVAZIONE_ID = "id"; public static final String MOTIVAZIONE_ID = "id";
public static final String PRODOTTO_CODE = "code"; public static final String PRODOTTO_CODE = "code";
public static final String WS_ANAGRAFICA_URL= "/WSAnagrafica.getList";
} }

View File

@@ -568,10 +568,14 @@ public class GepafinConstant {
public static final String PROTOCOL_MITTENTE="mittente"; public static final String PROTOCOL_MITTENTE="mittente";
public static final String PROTOCOL_DESTINATARI="destinatari"; public static final String PROTOCOL_DESTINATARI="destinatari";
public static final String PROTOCOL_EXTERNAL_YEAR="ANNO_PG"; public static final String PROTOCOL_EXTERNAL_YEAR="ANNO_PG";
public static final String PROTOCOL_EXTERNAL_NUMBER=""; public static final String PROTOCOL_EXTERNAL_NUMBER="NUM_PG";
public static final String PROTOCOL_EXTERNAL_DATE=""; public static final String PROTOCOL_EXTERNAL_DATE="DATA_PG_DT";
public static final String PROTOCOL_DOC_SUFFIX="#noauth";
public static final String CREATE_NDG="CHECK_OR_CREATE_NDG_CODE";
public static final String NDG_NOT_FOUND="ndg.not.found";
public static final String EMAIL_PEC_REQUIRED="email.pec.cannot.null";
public static final String USER_REQUEST_COMPLETED="user.request.completed";
public static final String END_DATE_GREATER_THAN_NOW="end.date.greater.than.now";
} }

View File

@@ -803,7 +803,7 @@ public class ApplicationAmendmentRequestDao {
} }
private List<ApplicationFormFieldEntity> getApplicationFormFieldList( public List<ApplicationFormFieldEntity> getApplicationFormFieldList(
ApplicationAmendmentRequestEntity applicationAmendment, ApplicationAmendmentRequestEntity applicationAmendment,
List<String> fieldIds) { List<String> fieldIds) {
List<ApplicationFormEntity> applicationFormList = applicationFormRepository List<ApplicationFormEntity> applicationFormList = applicationFormRepository
@@ -1146,6 +1146,7 @@ public class ApplicationAmendmentRequestDao {
public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) {
log.info("Extending response days for Application Amendment ID: {}, Additional Days: {}", id, newResponseDays); log.info("Extending response days for Application Amendment ID: {}, Additional Days: {}", id, newResponseDays);
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.EXPIRED.getValue()); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.EXPIRED.getValue());
log.info("Extending response days for Application Amendment ID: {}, Additional Days: {}", id, newResponseDays);
if (newResponseDays != null && newResponseDays > 0) { if (newResponseDays != null && newResponseDays > 0) {
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import com.amazonaws.services.dynamodbv2.xspec.S;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@@ -16,6 +17,11 @@ import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.request.*;
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.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.model.util.SortBy;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
@@ -50,15 +56,14 @@ import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream; import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -211,6 +216,12 @@ public class ApplicationDao {
@Autowired @Autowired
private ApplicationEvaluationDao applicationEvaluationDao; private ApplicationEvaluationDao applicationEvaluationDao;
@Autowired
private EvaluationCriteriaRepository evaluationCriteriaRepository;
@Autowired
private CallRepository callRepository;
public final Random random = new Random(); public final Random random = new Random();
public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) {
@@ -551,15 +562,45 @@ public class ApplicationDao {
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
List<ContentResponseBean> contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); List<ContentResponseBean> contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
// contentResponseBeans.stream()
// .filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId()))
// .map(ContentResponseBean::getSettings)
// .flatMap(List::stream)
// .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue()))
// .findFirst()
// .ifPresent(setting -> {
// Object fieldValue = applicationFormFieldRequestBean.getFieldValue();
// if(fieldValue!=null) {
// try {
// BigDecimal amountRequested = new BigDecimal(fieldValue.toString());
// applicationFormEntity.getApplication().setAmountRequested(amountRequested);
// log.info("Set amountRequested to {} for Application ID: {}", amountRequested, applicationFormEntity.getApplication().getId());
// } catch (NumberFormatException e) {
// log.error("Invalid number format for requested amount: {}", fieldValue, e);
// throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e);
// }
// }
// });
contentResponseBeans.stream() contentResponseBeans.stream()
.filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) .filter(content -> content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId()))
.map(ContentResponseBean::getSettings)
.flatMap(List::stream)
.filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue()))
.findFirst() .findFirst()
.ifPresent(setting -> { .ifPresent(content -> {
Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); Object fieldValue = applicationFormFieldRequestBean.getFieldValue();
if(fieldValue!=null) { if (fieldValue == null) {
return;
}
// Convert settings list to a map
Map<String, Object> settingMap = content.getSettings().stream()
.collect(Collectors.toMap(SettingResponseBean::getName, SettingResponseBean::getValue, (v1, v2) -> v1));
String fieldType = content.getName();
// Define handlers for different (fieldType + settingName) combinations
// Add handler for isRequestedAmount
if ("numberinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isRequestedAmount"))) {
try { try {
BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); BigDecimal amountRequested = new BigDecimal(fieldValue.toString());
applicationFormEntity.getApplication().setAmountRequested(amountRequested); applicationFormEntity.getApplication().setAmountRequested(amountRequested);
@@ -569,6 +610,19 @@ public class ApplicationDao {
throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e);
} }
} }
// Add handler for isPecEmail
if ("textinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isPecEmail"))) {
applicationFormEntity.getApplication().setPecEmail(fieldValue.toString());
log.info("Set PEC to {} for Application ID: {}", fieldValue, applicationFormEntity.getApplication().getId());
}
if ("textinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isPIVA"))) {
applicationFormEntity.getApplication().setVatNumber(fieldValue.toString());
log.info("Set PEC to {} for Application ID: {}", fieldValue, applicationFormEntity.getApplication().getId());
}
// Run all applicable handlers
}); });
@@ -938,9 +992,11 @@ public class ApplicationDao {
// call = callService.validatePublishedCall(call.getId()); // call = callService.validatePublishedCall(call.getId());
// checkIfApplicationExists(call, userWithCompanyEntity, userEntity); // checkIfApplicationExists(call, userWithCompanyEntity, userEntity);
HubEntity hubEntity = hubService.valdateHub(call.getHub().getId()); HubEntity hubEntity = hubService.valdateHub(call.getHub().getId());
if(call.getAllowMultipleApplications() == null || Boolean.FALSE.equals(call.getAllowMultipleApplications())){
if(hubEntity.getUniqueUuid().equals(defaultHubUuid)){ if(hubEntity.getUniqueUuid().equals(defaultHubUuid)){
checkIfApplicationExists(call, userWithCompanyEntity, userEntity); checkIfApplicationExists(call, userWithCompanyEntity, userEntity);
} }
}
ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity); ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity);
applicationEntity.setComments(applicationRequest.getComments()); applicationEntity.setComments(applicationRequest.getComments());
applicationEntity = saveApplicationEntity(applicationEntity); applicationEntity = saveApplicationEntity(applicationEntity);
@@ -1153,8 +1209,16 @@ public class ApplicationDao {
// Create the map for body placeholders // Create the map for body placeholders
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", call.getName()); bodyPlaceholders.put("{{call_name}}", call.getName());
bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY)); if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}",protocolNumber);
String protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if(protocol.getExternalProtocolDate()!=null){
protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{date}}", protocolDate);
bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS));
// Replace placeholders in the subject and body // Replace placeholders in the subject and body
@@ -1164,7 +1228,12 @@ public class ApplicationDao {
String email = userEntity.getEmail(); String email = userEntity.getEmail();
if (userEntity.getBeneficiary() != null) { if (userEntity.getBeneficiary() != null) {
emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY);
if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))){
email=applicationEntity.getPecEmail();
}else {
email = userEntity.getBeneficiary().getEmail(); email = userEntity.getBeneficiary().getEmail();
}
emailLogRequest.setRecipientId(userEntity.getBeneficiary().getId()); emailLogRequest.setRecipientId(userEntity.getBeneficiary().getId());
} }
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest);
@@ -1172,7 +1241,14 @@ public class ApplicationDao {
// recipientEmails.add(email); // recipientEmails.add(email);
String companyEmail = userWithCompany.getEmail(); String companyEmail = userWithCompany.getEmail();
String contactEmail = userWithCompany.getContactEmail(); String contactEmail = userWithCompany.getContactEmail();
if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))){
if (company.getPec()!=null) {
recipientEmails.add(company.getPec());
}else {
recipientEmails.add(userWithCompany.getPec());
}
}
else {
if (companyEmail != null && !companyEmail.isEmpty()) { if (companyEmail != null && !companyEmail.isEmpty()) {
recipientEmails.add(companyEmail); recipientEmails.add(companyEmail);
} }
@@ -1180,10 +1256,11 @@ public class ApplicationDao {
if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) {
recipientEmails.add(contactEmail); recipientEmails.add(contactEmail);
} }
}
if(Boolean.FALSE.equals(recipientEmails.isEmpty())){ if(Boolean.FALSE.equals(recipientEmails.isEmpty())){
emailLogRequest.setRecipientId(applicationEntity.getCompanyId()); emailLogRequest.setRecipientId(applicationEntity.getCompanyId());
emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY); emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY);
emailLogRequest.setRecipientEmails(companyEmail); emailLogRequest.setRecipientEmails(String.valueOf(recipientEmails));
} }
emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest);
} }
@@ -1204,8 +1281,17 @@ public class ApplicationDao {
// Create the map for body placeholders // Create the map for body placeholders
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", call.getName()); bodyPlaceholders.put("{{call_name}}", call.getName());
bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY));
if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
String protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if(protocol.getExternalProtocolDate()!=null){
protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
bodyPlaceholders.put("{{date}}",protocolDate);
bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS));
// Replace placeholders in the subject and body // Replace placeholders in the subject and body
@@ -1972,7 +2058,7 @@ public class ApplicationDao {
} }
// Wrap it in ="..." to make Excel treat it as a literal string // Wrap it in ="..." to make Excel treat it as a literal string
return "=\"" + stringValue.replace("\"", "\"\"") + "\""; return stringValue;
} catch (Exception e) { } catch (Exception e) {
return ""; return "";
@@ -2323,7 +2409,11 @@ public class ApplicationDao {
bodyPlaceholders.put("{{call_name}}", call.getName()); bodyPlaceholders.put("{{call_name}}", call.getName());
bodyPlaceholders.put("{{application_id}}", applicationEntity.getId().toString()); bodyPlaceholders.put("{{application_id}}", applicationEntity.getId().toString());
bodyPlaceholders.put("{{company_name}}", company.getCompanyName()); bodyPlaceholders.put("{{company_name}}", company.getCompanyName());
bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
bodyPlaceholders.put("{{user_action_id}}",emailLogRequest.getUserActionId().toString()); bodyPlaceholders.put("{{user_action_id}}",emailLogRequest.getUserActionId().toString());
String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders);
@@ -2335,4 +2425,128 @@ public class ApplicationDao {
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(GepafinConstant.RINALDO_EMAIL),emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(GepafinConstant.RINALDO_EMAIL),emailLogRequest);
} }
public byte[] downloadRankingCsv(Long callId,UserEntity userEntity) {
CallEntity callEntity = validator.validateUserWithCall(userEntity,callId);
List<ApplicationEntity> applications =
applicationRepository.findByCallIdAndIsDeletedFalseAndStatusIn(
callId,
List.of(
ApplicationStatusForEvaluation.APPROVED.getValue(),
ApplicationStatusForEvaluation.ADMISSIBLE.getValue(),
ApplicationStatusForEvaluation.TECHNICAL_EVALUATION.getValue()
));
List<String> dynamicLabels = new ArrayList<>(); // Maintain insertion order, allow duplicates only once
Map<Long, Map<String, String>> appLabelScoresMap = new HashMap<>();
Map<Long, ApplicationEntity> applicationMap = new HashMap<>();
Map<Long, String> appTotalScoreMap = new HashMap<>();
Map<Long, String> appInstructorMap = new HashMap<>(); // New map to store instructor name per app
for (ApplicationEntity app : applications) {
Long appId = app.getId();
applicationMap.put(appId, app);
ApplicationEvaluationEntity evaluation =
applicationEvaluationRepository.findByApplicationId(appId);
if (evaluation != null && evaluation.getAssignedApplicationsEntity() != null) {
Long userId = evaluation.getAssignedApplicationsEntity().getUserId();
if (userId != null) {
userRepository.findById(userId).ifPresent(user -> {
String firstName = user.getFirstName() != null ? user.getFirstName() : "";
String lastName = user.getLastName() != null ? user.getLastName() : "";
appInstructorMap.put(appId, firstName + " " + lastName);
});
}
}
BigDecimal totalScore = applicationEvaluationDao.calculateTotalScore(evaluation.getCriteria());
appTotalScoreMap.put(appId, Utils.convertToItalianFormatWithOnlyDecimalValue(String.valueOf(totalScore)));
List<CriteriaResponse> criteriaList =
evaluation.getCriteria() != null ?
Utils.convertJsonToList(evaluation.getCriteria(), new TypeReference<List<CriteriaResponse>>() {}) :
List.of();
List<CriteriaResponse> dbCriteriaList = applicationEvaluationDao.getCriteriaResponse(appId);
Map<String, String> scoreByLabel = new HashMap<>();
for (CriteriaResponse criteria : criteriaList) {
Optional<CriteriaResponse> matchedDb = dbCriteriaList.stream()
.filter(db -> Objects.equals(db.getId(), criteria.getId()))
.findFirst();
String label = matchedDb.map(CriteriaResponse::getLabel).orElse("");
if (!dynamicLabels.contains(label)) {
dynamicLabels.add(label);
}
String criteriaScore= String.valueOf(criteria.getScore() != null ? criteria.getScore() : BigDecimal.ZERO);
scoreByLabel.put(label, Utils.convertToItalianFormatWithOnlyDecimalValue(criteriaScore));
}
appLabelScoresMap.put(appId, scoreByLabel);
}
// Build headers dynamically
List<String> headers = new ArrayList<>(List.of(
"ApplicationID","Application VatNumber", "VatNumber", "Company Name", "Protocol", "Requested Amount", "Status","Instructor Name","Application PEC","Company PEC","Total Score"
));
headers.addAll(dynamicLabels);
// Prepare data rows
List<List<Object>> rows = new ArrayList<>();
for (ApplicationEntity app : applications) {
Long appId = app.getId();
CompanyEntity company = companyService.validateCompany(app.getCompanyId());
ProtocolEntity protocolEntity = app.getProtocol();
List<Object> row = new ArrayList<>();
row.add(appId);
row.add(app.getVatNumber());
row.add(company.getVatNumber());
row.add(company.getCompanyName());
row.add(protocolEntity != null ? protocolEntity.getProtocolNumber() : 0L);
String formattedAmount=Utils.convertToItalianFormatWithOnlyDecimalValue(String.valueOf(app.getAmountRequested()));
row.add(formattedAmount);
row.add(app.getStatus());
row.add(appInstructorMap.getOrDefault(appId, ""));
row.add(app.getPecEmail());
row.add(company.getPec());
row.add(appTotalScoreMap.get(appId));
Map<String, String> scores = appLabelScoresMap.getOrDefault(appId, Collections.emptyMap());
for (String label : dynamicLabels) {
row.add(scores.getOrDefault(label, ""));
}
rows.add(row);
}
// Generate CSV
ByteArrayOutputStream out = new ByteArrayOutputStream();
try (OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
CSVPrinter csvPrinter = new CSVPrinter(writer,
CSVFormat.DEFAULT
.withDelimiter(';')
.withHeader(headers.toArray(new String[0])))) {
for (List<Object> row : rows) {
csvPrinter.printRecord(row);
}
csvPrinter.flush();
} catch (IOException e) {
throw new RuntimeException("Error while generating CSV", e);
}
return out.toByteArray();
}
} }

View File

@@ -710,7 +710,11 @@ public class ApplicationEvaluationDao {
Map<String, String> placeHolders = new HashMap<>(); Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName()); placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); String protocolNumber=application.getProtocol().getExternalProtocolNumber();
if(protocolNumber==null){
protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber());
}
placeHolders.put("{{protocol_number}}", protocolNumber);
notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_CREATION);
notificationDao.sendNotificationToInstructor(placeHolders,entity,NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToInstructor(placeHolders,entity,NotificationTypeEnum.EVALUATION_CREATION);
@@ -1151,7 +1155,7 @@ public class ApplicationEvaluationDao {
applicationEvaluationResponse.setEmailSendResponse(entity.getEmailSendResponse()); applicationEvaluationResponse.setEmailSendResponse(entity.getEmailSendResponse());
return applicationEvaluationResponse; return applicationEvaluationResponse;
} }
private List<EvaluationDocumentRequest> prepareEvaluationDocumentBeanList(ApplicationEvaluationEntity entity) { public List<EvaluationDocumentRequest> prepareEvaluationDocumentBeanList(ApplicationEvaluationEntity entity) {
List<EvaluationDocumentRequest> docRequest = new ArrayList<>(); List<EvaluationDocumentRequest> docRequest = new ArrayList<>();
if (entity != null && entity.getEvaluationDocument() != null) { if (entity != null && entity.getEvaluationDocument() != null) {
@@ -1545,13 +1549,13 @@ public class ApplicationEvaluationDao {
return callRepository.findCallEntityByApplicationId(applicationId); return callRepository.findCallEntityByApplicationId(applicationId);
} }
private List<EvaluationCriteriaEntity> getEvaluationCriterias(CallEntity call) { public List<EvaluationCriteriaEntity> getEvaluationCriterias(CallEntity call) {
log.info("Fetching evaluation criterias for callId: {}", call.getId()); log.info("Fetching evaluation criterias for callId: {}", call.getId());
return evaluationCriteriaRepository return evaluationCriteriaRepository
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue());
} }
private CriteriaResponse buildCriteriaResponse(Long applicationId, EvaluationCriteriaEntity criteria) { public CriteriaResponse buildCriteriaResponse(Long applicationId, EvaluationCriteriaEntity criteria) {
CriteriaResponse response = new CriteriaResponse(); CriteriaResponse response = new CriteriaResponse();
response.setId(criteria.getId()); response.setId(criteria.getId());
response.setLabel(criteria.getLookupData().getValue()); response.setLabel(criteria.getLookupData().getValue());
@@ -1906,7 +1910,8 @@ public class ApplicationEvaluationDao {
Optional<ApplicationEvaluationEntity> existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse( Optional<ApplicationEvaluationEntity> existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(
assignedApplicationsEntity.getId()); assignedApplicationsEntity.getId());
ApplicationEvaluationEntity entity; ApplicationEvaluationEntity entity;
UserEntity user=userService.validateUser(application.getUserId());
HubEntity hub=user.getHub();
EmailSendResponse emailSendResponse = new EmailSendResponse(); EmailSendResponse emailSendResponse = new EmailSendResponse();
if (existingEntityOptional.isPresent()) { if (existingEntityOptional.isPresent()) {
ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); ApplicationEvaluationEntity existingEntity = existingEntityOptional.get();
@@ -1927,19 +1932,28 @@ public class ApplicationEvaluationDao {
} }
} }
if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION)){
log.info("Processing technical evaluation for applicationId: {}", application.getId()); log.info("Processing technical evaluation for applicationId: {}", application.getId());
processTechnicalEvaluation(application.getId(), application, newStatus); processTechnicalEvaluation(application.getId(), application, newStatus);
} }
if((newStatus.equals(ApplicationStatusForEvaluation.APPROVED) || newStatus.equals(ApplicationStatusForEvaluation.REJECTED)) && application.getStatus().equals(ApplicationStatusTypeEnum.EVALUATION.getValue())) { if((newStatus.equals(ApplicationStatusForEvaluation.APPROVED) || newStatus.equals(ApplicationStatusForEvaluation.REJECTED))) {
application.setStatus(newStatus.getValue()); application.setStatus(newStatus.getValue());
log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId()); log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId());
} }
application = applicationRepository.save(application);
/** This code is responsible for adding a version history log for the "Update Application" operation. **/ if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION_REJECTED)) {
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(application).build()); application.setStatus(newStatus.getValue());
log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId());
emailNotificationDao.sendMailForApplicationTechnicalEvaluationRejected(application,hub,existingEntity);
application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request);
responses = List.of(emailSendResponse);
if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) {
saveEmailSendResponseToEvaluation(emailSendResponse, existingEntity);
}
}
application = applicationRepository.save(application);
ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity); ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity);
AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity); AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity);
@@ -1950,7 +1964,7 @@ public class ApplicationEvaluationDao {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED));
} }
String statusType = application.getStatus(); String statusType = application.getStatus();
if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION_REJECTED.getValue())) {
existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue());
existingEntity.setClosingDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); existingEntity.setClosingDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue()); assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue());
@@ -1965,7 +1979,7 @@ public class ApplicationEvaluationDao {
entity = applicationEvaluationRepository.save(existingEntity); entity = applicationEvaluationRepository.save(existingEntity);
assignedApplicationsRepository.save(assignedApplicationsEntity); assignedApplicationsRepository.save(assignedApplicationsEntity);
if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION_REJECTED.getValue())) {
/** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/ /** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluation).newData(entity).build()); loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluation).newData(entity).build());
@@ -1995,9 +2009,16 @@ public class ApplicationEvaluationDao {
notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT);
} }
/** This code is responsible for adding a version history log for the "Update Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(application).build());
Map<String, String> placeHolders = new HashMap<>(); Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName()); placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); String protocolNumber=application.getProtocol().getExternalProtocolNumber();
if(protocolNumber==null){
protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber());
}
placeHolders.put("{{protocol_number}}", protocolNumber);
notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_RESULT);
notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT);
@@ -2565,7 +2586,7 @@ public class ApplicationEvaluationDao {
} }
} }
private BigDecimal calculateTotalScore(String criteriaJson){ public BigDecimal calculateTotalScore(String criteriaJson){
try { try {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
// Convert JSON string to List of Maps // Convert JSON string to List of Maps
@@ -2584,7 +2605,7 @@ public class ApplicationEvaluationDao {
return totalScore; return totalScore;
} }
catch (Exception e) { catch (Exception e) {
log.error(" Error parsing criteria JSON: {}", e.getMessage()); log.error("Error parsing criteria JSON. Input: {}. Exception: {}", criteriaJson, e.getMessage(), e);
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
} }

View File

@@ -12,16 +12,8 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.constants.AppointmentApiConstant; import net.gepafin.tendermanagement.constants.AppointmentApiConstant;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.entities.HubEntity;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.NotificationTypeEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.AppointmentCreationRequest; import net.gepafin.tendermanagement.model.request.AppointmentCreationRequest;
import net.gepafin.tendermanagement.model.request.AppointmentNdgRequest; import net.gepafin.tendermanagement.model.request.AppointmentNdgRequest;
import net.gepafin.tendermanagement.model.request.AppointmentVisuraListRequest; import net.gepafin.tendermanagement.model.request.AppointmentVisuraListRequest;
@@ -33,11 +25,7 @@ import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse;
import net.gepafin.tendermanagement.model.response.AppointmentLoginResponse; import net.gepafin.tendermanagement.model.response.AppointmentLoginResponse;
import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; import net.gepafin.tendermanagement.model.response.DocumentUploadResponse;
import net.gepafin.tendermanagement.model.response.NdgResponse; import net.gepafin.tendermanagement.model.response.NdgResponse;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.repositories.CompanyRepository;
import net.gepafin.tendermanagement.repositories.DocumentRepository;
import net.gepafin.tendermanagement.repositories.HubRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.CompanyService;
@@ -55,6 +43,8 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
@@ -63,10 +53,8 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.*;
import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@Component @Component
@@ -150,7 +138,11 @@ public class AppointmentDao {
@Autowired @Autowired
private ApplicationEvaluationDao applicationEvaluationDao; private ApplicationEvaluationDao applicationEvaluationDao;
private final Map<Long, ExecutorService> executorMap = new ConcurrentHashMap<>(); @Autowired
private NdganagRepository ndganagRepository;
private final Map<Long, ScheduledExecutorService> executorMap = new ConcurrentHashMap<>();
private final ConcurrentHashMap<Long, ExecutorService> threadForDocumentMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap<Long, ExecutorService> threadForDocumentMap = new ConcurrentHashMap<>();
@@ -159,7 +151,16 @@ public class AppointmentDao {
public NdgResponse checkNdgForAppointment(Long applicationId) { public NdgResponse checkNdgForAppointment(Long applicationId) {
log.info("Starting NDG check for appointment. applicationId: {}", applicationId); log.info("Starting NDG check for appointment. applicationId: {}", applicationId);
ApplicationEntity application = applicationService.validateApplication(applicationId); ApplicationEntity application = applicationService.validateApplication(applicationId);
ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
NdgResponse ndgResponse = new NdgResponse(); NdgResponse ndgResponse = new NdgResponse();
CompanyEntity company = companyService.validateCompany(application.getCompanyId());
NdganagEntity ndganagEntity = ndganagRepository.findByVatNumber(company.getVatNumber());
if (ndganagEntity != null && ndganagEntity.getNdg() != null) {
ndgResponse.setNdg(ndganagEntity.getNdg());
return ndgResponse;
}
if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) { if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) {
log.warn("NDG generation already in progress. applicationId: {}", applicationId); log.warn("NDG generation already in progress. applicationId: {}", applicationId);
throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS));
@@ -171,10 +172,14 @@ public class AppointmentDao {
} }
// Update application status // Update application status
log.info("Updating NDG status to IN_PROGRESS. applicationId: {}", applicationId); log.info("Updating NDG status of applicationId: {}", applicationId);
application.setNdgStatus(GepafinConstant.NDG_IN_PROGRESS); application.setNdgStatus(NdgStatusEnum.NDG_INITITATED.getValue());
applicationRepository.save(application); applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
// Start async processing // Start async processing
HubEntity hub = hubRepository.findByHubId(application.getHubId()); HubEntity hub = hubRepository.findByHubId(application.getHubId());
loginToOdessa(hub, application); loginToOdessa(hub, application);
@@ -392,6 +397,7 @@ public class AppointmentDao {
} }
throw new RuntimeException("Max retries exceeded. Failed to login to Odessa."); throw new RuntimeException("Max retries exceeded. Failed to login to Odessa.");
} }
private void CheckPasswordExpiredOrErrorInResponse(ApplicationEntity application, FeignException.Forbidden forbiddenException) { private void CheckPasswordExpiredOrErrorInResponse(ApplicationEntity application, FeignException.Forbidden forbiddenException) {
String responseBody = forbiddenException.contentUTF8(); String responseBody = forbiddenException.contentUTF8();
@@ -431,44 +437,99 @@ public class AppointmentDao {
} }
} }
private void startAsyncNdgProcessing(Long applicationId) { // private void startAsyncNdgProcessing(Long applicationId) {
// Check if a thread is already running for this application // // If already polling for this applicationId, do nothing:
if (executorMap.containsKey(applicationId)) { // if (executorMap.containsKey(applicationId)) {
log.warn("Async processing already running for applicationId: {}", applicationId); // log.warn("Async processing already running for applicationId: {}", applicationId);
return; // return;
// }
// ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request);
//
// ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
// Thread t = new Thread(runnable);
// t.setName("AsyncNdgProcessing-" + applicationId);
// return t;
// });
// executorMap.put(applicationId, scheduler);
//
// // Record the start time so we can stop after 2 hours:
// long startTime = System.currentTimeMillis();
// long twoHoursMs = TimeUnit.HOURS.toMillis(2);
// long fifteenMin = 15; // in MINUTES
//
// // We need a reference to cancel the scheduled task from inside itself when we're done:
// AtomicReference<ScheduledFuture<?>> futureRef = new AtomicReference<>();
//
// Runnable pollingTask = () -> {
// RequestContextHolder.setRequestAttributes(requestAttributes, true);
// Utils.setHttpServletRequestForThread(request,HttpMethodEnum.POST.getValue(),GepafinConstant.CREATE_NDG, (Long) request.getAttribute(GepafinConstant.USER_ACTION_ID));
// try {
// // 1) If 2 hours have already passed, mark as FAILED and shut down:
// if (System.currentTimeMillis() - startTime > twoHoursMs) {
// ApplicationEntity app = applicationService.validateApplication(applicationId);
// log.warn("2-hour timeout reached for applicationId {}. Marking NDG_FAILED.", applicationId);
// app.setNdgStatus(GepafinConstant.NDG_FAILED);
// applicationRepository.save(app);
//
// futureRef.get().cancel(false);
// shutdownScheduler(applicationId);
// return;
// }
//
// // 2) Otherwise, call processNdgGeneration once:
// processNdgGeneration(applicationId);
//
// // 3) After return, check if NDG is now set or timed out. If so, cancel & shut down:
// ApplicationEntity updated = applicationService.validateApplication(applicationId);
// if (isNdgValid(updated.getNdg())) {
// log.info("NDG found for applicationId {}. Shutting down scheduler.", applicationId);
// futureRef.get().cancel(false);
// shutdownScheduler(applicationId);
// } else if (updated.getNdgStatus() != null && updated.getNdgStatus().equals(GepafinConstant.NDG_FAILED)) {
// log.info("NDG status is NDG_FAILED for applicationId {}. Shutting down scheduler.", applicationId);
// futureRef.get().cancel(false);
// shutdownScheduler(applicationId);
// }
// // Otherwise: no NDG yet, not timed out → next run happens in 15 minutes automatically.
// } catch (Exception ex) {
// log.error("Unexpected error during scheduled polling for applicationId {}: {}", applicationId, ex.getMessage(), ex);
// try {
// ApplicationEntity checkApp = applicationService.validateApplication(applicationId);
// if (System.currentTimeMillis() - startTime > twoHoursMs) {
// log.warn("After exception, 2-hour window passed for applicationId {}. Marking NDG_FAILED.", applicationId);
// checkApp.setNdgStatus(GepafinConstant.NDG_FAILED);
// applicationRepository.save(checkApp);
//
// futureRef.get().cancel(false);
// shutdownScheduler(applicationId);
// }
// } catch (Exception ignore) {
// futureRef.get().cancel(false);
// shutdownScheduler(applicationId);
// }
// }
// };
//
// // Schedule pollingTask: run now (delay=0), then every fifteen minutes:
// ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(pollingTask, 0, // initial delay = 0 min → run immediately
// fifteenMin, // subsequent runs every 15 minutes
// TimeUnit.MINUTES);
// futureRef.set(future);
// }
private void shutdownScheduler(Long applicationId) {
ScheduledExecutorService shed = executorMap.remove(applicationId);
if (shed != null) {
shed.shutdownNow();
}
log.info("Scheduler shut down for applicationId: {}", applicationId);
} }
// Create a dedicated thread for asynchronous processing private void processNdgGeneration(ApplicationEntity application, CompanyEntity company, HubEntity hub) {
ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> {
Thread thread = new Thread(runnable);
thread.setName("AsyncNdgProcessing-" + applicationId);
return thread;
});
executorMap.put(applicationId, executor);
executor.submit(() -> {
try {
log.info("Starting async processing for applicationId: {}", applicationId);
processNdgGeneration(applicationId);
} catch (Exception e) {
log.error("Error in async NDG processing for applicationId: {}", applicationId, e);
} finally {
// Cleanup resources
ExecutorService executorToShutdown = executorMap.remove(applicationId);
if (executorToShutdown != null) {
executorToShutdown.shutdown();
}
log.info("Async processing completed for applicationId: {}", applicationId);
}
});
}
private void processNdgGeneration(Long applicationId) {
// Validate application, company, and hub // Validate application, company, and hub
Long applicationId = application.getId();
log.info("Starting NDG generation process for applicationId: {}", applicationId); log.info("Starting NDG generation process for applicationId: {}", applicationId);
ApplicationEntity application = applicationService.validateApplication(applicationId);
CompanyEntity company = companyService.validateCompany(application.getCompanyId());
HubEntity hub = hubRepository.findByHubId(application.getHubId());
if (!hub.getUniqueUuid().equals(defaultHubUuid)) { if (!hub.getUniqueUuid().equals(defaultHubUuid)) {
log.info("Ndg cannot be created for another Hub, it is default for Gepafin."); log.info("Ndg cannot be created for another Hub, it is default for Gepafin.");
@@ -484,82 +545,125 @@ public class AppointmentDao {
String authorizationToken = getBearerToken(hub); String authorizationToken = getBearerToken(hub);
// Try retrieving NDG by VAT number // Try retrieving NDG by VAT number
AppointmentLoginResponse ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application); AppointmentLoginResponse ndgResponse=new AppointmentLoginResponse();
ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application);
if (isNdgValid(ndgResponse.getNdg())) { if (isNdgValid(ndgResponse.getNdg())) {
saveNdgAndIdVisura(application, company, ndgResponse.getNdg(), null); saveNdg(application, company, ndgResponse.getNdg());
log.info("NDG successfully generated for applicationId: {}", applicationId); log.info("NDG successfully generated for applicationId: {}", applicationId);
} else { } else {
// If NDG isn't immediately available, start polling log.info("Polling for NDG for applicationId: {}", applicationId);
handleNdgPolling(application, company, hub, authorizationToken); handleNdgPolling(application, company, hub, authorizationToken);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("Exception occurred during NDG generation. ApplicationId: {}, CompanyId: {}, HubId: {}, Error: {}", log.error("Exception occurred during NDG generation. ApplicationId: {}, CompanyId: {}, HubId: {}, Error: {}", applicationId, company.getId(), hub.getId(),
applicationId, company.getId(), hub.getId(), e.getMessage(), e); e.getMessage(), e);
} }
} }
private void handleNdgPolling(ApplicationEntity application, CompanyEntity company, HubEntity hub, String authorizationToken) { private void handleNdgPolling(ApplicationEntity application, CompanyEntity company, HubEntity hub, String authorizationToken) {
try { log.info("Starting singleshot NDG polling attempt for applicationId: {}, CompanyId: {}, HubId: {}", application.getId(), company.getId(), hub.getId());
log.info("Starting NDG polling for applicationId: {}, CompanyId: {}, HubId: {}", application.getId(),company.getId(), hub.getId()); ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
CompanyEntity oldCompanyEntity = Utils.getClonedEntityForData(company);
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
long twoHoursMs = TimeUnit.HOURS.toMillis(2);
while (true) { try {
// 1) If NDG was already populated (perhaps by another thread), skip polling.
if (application.getNdg() != null) { if (application.getNdg() != null) {
log.info("NDG retrieved for applicationId: {}", application.getId()); log.info("NDG already present for applicationId {}. Exiting singleshot polling.", application.getId());
break; return;
} }
try { // 2) Attempt to create Visura (this may immediately return a valid NDG)
// Fetch Visura list and attempt to parse NDG AppointmentLoginResponse visuraResponse = createVisura(company, authorizationToken, hub);
String visuraListJson = getVisuraList(application.getIdVisura(), authorizationToken, application, hub);
log.debug("Parsing NDG from visura list response | ApplicationId: {}", application.getId());
String ndg = parseNdgFromVisuraListResponse(visuraListJson);
if (isNdgValid(ndg)) {
// CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company);
// ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application);
log.info("Valid NDG retrieved: {} | ApplicationId: {}", ndg, application.getId()); // 2a) If createVisura gave us a valid NDG, persist & exit
company.setNdg(ndg); String fetchedNdg = visuraResponse.getNdg();
application.setNdg(ndg); if (isNdgValid(fetchedNdg)) {
log.info("Valid NDG retrieved from createVisura(): {} | applicationId: {}", fetchedNdg, application.getId());
company.setNdg(fetchedNdg);
application.setNdg(fetchedNdg);
application.setNdgStatus(NdgStatusEnum.NDG_GENERATED.getValue());
application.setStatus(ApplicationStatusTypeEnum.NDG.getValue());
application.setIdVisura(visuraResponse.getIdVisura());
companyRepository.save(company);
applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyEntity).newData(company).build());
ApplicationEvaluationEntity eval = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId());
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{{call_name}}", application.getCall().getName());
placeholders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber()));
notificationDao.sendNotificationToInstructor(placeholders, eval, NotificationTypeEnum.NDG_GENERATION);
notificationDao.sendNotificationToSuperUser(application, placeholders, NotificationTypeEnum.NDG_GENERATION);
log.info("NDG saved successfully for applicationId: {}", application.getId());
return;
}
// 2b) If no immediate NDG, fetch the Visura list JSON and parse out NDG
String visuraListJson = getVisuraList(visuraResponse.getIdVisura(), authorizationToken, application, hub);
log.debug("Parsing NDG from VisuraList JSON for applicationId: {}", application.getId());
String parsedNdg = parseNdgFromVisuraListResponse(visuraListJson);
if (isNdgValid(parsedNdg)) {
log.info("Valid NDG parsed from VisuraList: {} | applicationId: {}", parsedNdg, application.getId());
company.setNdg(parsedNdg);
application.setNdg(parsedNdg);
application.setNdgStatus(GepafinConstant.NDG_GENERATED); application.setNdgStatus(GepafinConstant.NDG_GENERATED);
application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); application.setStatus(ApplicationStatusTypeEnum.NDG.getValue());
applicationRepository.save(application); application.setIdVisura(visuraResponse.getIdVisura());
companyRepository.save(company);
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); companyRepository.save(company);
// Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyEntity).newData(company).build());
ApplicationEvaluationEntity eval = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId());
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{{call_name}}", application.getCall().getName());
placeholders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber()));
notificationDao.sendNotificationToInstructor(placeholders, eval, NotificationTypeEnum.NDG_GENERATION);
notificationDao.sendNotificationToSuperUser(application, placeholders, NotificationTypeEnum.NDG_GENERATION);
Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber()));
notificationDao.sendNotificationToInstructor(placeHolders, applicationEvaluationEntity, NotificationTypeEnum.NDG_GENERATION);
notificationDao.sendNotificationToSuperUser(application, placeHolders, NotificationTypeEnum.NDG_GENERATION);
log.info("NDG saved successfully for applicationId: {}", application.getId()); log.info("NDG saved successfully for applicationId: {}", application.getId());
break; return;
} }
// Check if polling has timed out // 3) Neither direct API nor parsing yielded a valid NDG. Check timeout.
if (System.currentTimeMillis() - startTime > TimeUnit.HOURS.toMillis(2)) { if (System.currentTimeMillis() - startTime > twoHoursMs) {
log.warn("NDG polling timed out for applicationId: {}", application.getId()); log.warn("NDG polling timed out after 2 hours for applicationId: {}", application.getId());
application.setNdgStatus(GepafinConstant.NDG_FAILED); application.setNdgStatus(GepafinConstant.NDG_FAILED);
applicationRepository.save(application); applicationRepository.save(application);
break; return;
} }
// Wait before the next polling attempt // 4) No NDG yet—just return. The scheduler will retry in 15 minutes.
Thread.sleep(TimeUnit.MINUTES.toMillis(15)); log.info("No valid NDG yet for applicationId {}. Returning to scheduler—next attempt in 15 minutes.", application.getId());
} catch (InterruptedException e) {
log.warn("NDG polling interrupted for applicationId: {}", application.getId());
Thread.currentThread().interrupt();
break;
} catch (Exception e) { } catch (Exception e) {
log.error("Error during NDG polling for applicationId: {}", application.getId(), e); log.error("Exception during NDG polling for applicationId: {}", application.getId(), e);
// If timeout after exception, mark NDG_FAILED
if (System.currentTimeMillis() - startTime > twoHoursMs) {
log.warn("Example: exiting singleshot polling due to timeout after exception for applicationId: {}", application.getId());
application.setNdgStatus(GepafinConstant.NDG_FAILED);
applicationRepository.save(application);
} else {
log.info("Exception occurred but not timed out for applicationId {}. Returning to scheduler for next attempt in 15 minutes.", application.getId());
} }
} }
} finally {
log.info("NDG polling completed for applicationId: {}", application.getId()); log.info("NDG polling completed for applicationId: {}", application.getId());
} }
}
private static String getBearerToken(HubEntity hub) { private static String getBearerToken(HubEntity hub) {
@@ -571,15 +675,21 @@ public class AppointmentDao {
return ndg != null && !ndg.isEmpty(); return ndg != null && !ndg.isEmpty();
} }
private void saveNdgAndIdVisura(ApplicationEntity application, CompanyEntity company, String ndg, String idVisura) { private void saveNdg(ApplicationEntity application, CompanyEntity company, String ndg) {
ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
CompanyEntity oldCompanyEntity = Utils.getClonedEntityForData(company);
application.setNdg(ndg); application.setNdg(ndg);
application.setIdVisura(idVisura);
application.setNdgStatus(GepafinConstant.NDG_GENERATED); application.setNdgStatus(GepafinConstant.NDG_GENERATED);
application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); application.setStatus(ApplicationStatusTypeEnum.NDG.getValue());
company.setNdg(ndg); company.setNdg(ndg);
companyRepository.save(company); companyRepository.save(company);
applicationRepository.save(application); applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyEntity).newData(company).build());
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId());
// Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); // Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION);
Map<String, String> placeHolders = new HashMap<>(); Map<String, String> placeHolders = new HashMap<>();
@@ -618,10 +728,7 @@ public class AppointmentDao {
try { try {
log.info("Initiating NDG retrieval by VAT number | ApplicationId: {}, HubId: {}, VAT: {}", application.getId(), hub.getId(), vatNumber); log.info("Initiating NDG retrieval by VAT number | ApplicationId: {}, HubId: {}, VAT: {}", application.getId(), hub.getId(), vatNumber);
// Prepare the NDG request // Prepare the NDG request
AppointmentNdgRequest ndgRequest = getAppointmentNdgRequest(vatNumber); String responseJson = getNdgFromExternalService(vatNumber, authorizationToken);
// Call the API to retrieve NDG
ResponseEntity<Object> response = appointmentApiService.getNdgByVatNumber(ndgRequest, authorizationToken);
String responseJson = Utils.convertObjectToJson(response.getBody());
// Parse and return the NDG response // Parse and return the NDG response
return parseNdgResponse(responseJson); return parseNdgResponse(responseJson);
} catch (FeignException.Forbidden forbiddenException) { } catch (FeignException.Forbidden forbiddenException) {
@@ -750,48 +857,65 @@ public class AppointmentDao {
public AppointmentLoginResponse parseVisuraResponse(String jsonResponse) { public AppointmentLoginResponse parseVisuraResponse(String jsonResponse) {
try { try {
// Log full raw JSON for debug purposes
log.info("Raw Visura JSON Response: {}", jsonResponse);
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode rootNode = objectMapper.readTree(jsonResponse);
JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING); JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING);
if (dataNode != null) { if (dataNode != null && dataNode.isObject()) {
AppointmentLoginResponse response = new AppointmentLoginResponse(); AppointmentLoginResponse response = new AppointmentLoginResponse();
response.setIdVisura(normalizeNullValue(dataNode.get(GepafinConstant.ID_VISURA_STRING).asText())); JsonNode idVisuraNode = dataNode.get(GepafinConstant.ID_VISURA_STRING);
response.setNdg(normalizeNullValue(dataNode.get(GepafinConstant.NDG_STRING).asText())); JsonNode ndgNode = dataNode.get(GepafinConstant.NDG_STRING);
if (idVisuraNode == null || ndgNode == null) {
log.error("Missing expected fields in 'data' node. JSON: {}", dataNode);
}
response.setIdVisura(normalizeNullValue(idVisuraNode != null ? idVisuraNode.asText() : null));
response.setNdg(normalizeNullValue(ndgNode != null ? ndgNode.asText() : null));
return response; return response;
} else { } else {
throw new RuntimeException("Invalid JSON structure: Missing 'data' node."); System.err.println("Invalid JSON: 'data' node is missing or not an object.");
throw new RuntimeException("Invalid JSON structure: Missing or malformed 'data' node.");
} }
} catch (Exception e) { } catch (Exception e) {
System.err.println("Exception while parsing Visura response: " + e.getMessage());
throw new RuntimeException("Failed to parse response: " + e.getMessage(), e); throw new RuntimeException("Failed to parse response: " + e.getMessage(), e);
} }
} }
public AppointmentLoginResponse parseNdgResponse(String jsonResponse) { public AppointmentLoginResponse parseNdgResponse(String jsonResponse) {
AppointmentLoginResponse loginResponse = new AppointmentLoginResponse();
String ndg=extractNdg(jsonResponse);
if (ndg==null){ return null;}
else {
loginResponse.setNdg(ndg);
}
return loginResponse;
}
private String extractNdg(String jsonResponse) {
try { try {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode rootNode = objectMapper.readTree(jsonResponse);
JsonNode dataArray = rootNode.get(GepafinConstant.DATA_STRING); JsonNode dataArray = rootNode.get(GepafinConstant.DATA_STRING);
if (dataArray == null || !dataArray.isArray() || dataArray.isEmpty()) { if (dataArray == null || !dataArray.isArray() || dataArray.isEmpty()) {
log.info("NDG data is empty or missing in the response."); log.info("NDG data is empty or missing in the response.");
AppointmentLoginResponse emptyResponse = new AppointmentLoginResponse(); return null;
emptyResponse.setNdg(null);
return emptyResponse;
} }
JsonNode firstDataEntry = dataArray.get(0); JsonNode firstDataEntry = dataArray.get(0);
AppointmentLoginResponse response = new AppointmentLoginResponse(); AppointmentLoginResponse response = new AppointmentLoginResponse();
if (firstDataEntry.has(GepafinConstant.NDG_STRING)) { if (firstDataEntry.has(GepafinConstant.NDG_STRING)) {
response.setNdg(normalizeNullValue(firstDataEntry.get(GepafinConstant.NDG_STRING).asText())); String ndg=normalizeNullValue(firstDataEntry.get(GepafinConstant.NDG_STRING).asText());
return ndg;
} }
return response;
} catch (Exception e) { } catch (Exception e) {
log.error("Failed to parse response: {}", e.getMessage(), e); log.error("Failed to parse response: {}", e.getMessage(), e);
throw new RuntimeException("Failed to parse NDG response.", e); throw new RuntimeException("Failed to parse NDG response.", e);
} }
return null;
} }
private String normalizeNullValue(String value) { public String normalizeNullValue(String value) {
return (value == null || GepafinConstant.NULL_STRING.equalsIgnoreCase(value.trim())) ? null : value; return (value == null || GepafinConstant.NULL_STRING.equalsIgnoreCase(value.trim())) ? null : value;
} }
@@ -1206,4 +1330,156 @@ public class AppointmentDao {
throw new RuntimeException("Failed to parse response: " + e.getMessage(), e); throw new RuntimeException("Failed to parse response: " + e.getMessage(), e);
} }
} }
private void startAsyncNdgProcessing(Long applicationId) {
if (executorMap.containsKey(applicationId)) {
log.warn("Async processing already running for applicationId: {}", applicationId);
return;
} }
ApplicationEntity application = applicationService.validateApplication(applicationId);
CompanyEntity company = companyService.validateCompany(application.getCompanyId());
ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
CompanyEntity oldCompanyEntity = Utils.getClonedEntityForData(company);
ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request);
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
Thread t = new Thread(r);
t.setName("AsyncNdgPolling-" + applicationId);
return t;
});
executorMap.put(applicationId, scheduler);
application.setNdgStatus(NdgStatusEnum.NDG_IN_PROGRESS.getValue());
applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
long startTime = System.currentTimeMillis();
long twoHoursMs = TimeUnit.HOURS.toMillis(2);
long fifteenMin = 15;
HubEntity hub = hubRepository.findByHubId(application.getHubId());
// 1. Run full NDG generation logic once upfront
processNdgGeneration(application, company, hub);
AtomicReference<ScheduledFuture<?>> futureRef = new AtomicReference<>();
// 2. Now define the polling logic ONLY
Runnable pollingTask = () -> {
RequestContextHolder.setRequestAttributes(requestAttributes, true);
Utils.setHttpServletRequestForThread(request, HttpMethodEnum.POST.getValue(),
GepafinConstant.CREATE_NDG, (Long) request.getAttribute(GepafinConstant.USER_ACTION_ID));
try {
// Stop if timeout
if (System.currentTimeMillis() - startTime > twoHoursMs) {
log.warn("Polling timed out for applicationId {}. Marking NDG_FAILED.", applicationId);
application.setNdgStatus(GepafinConstant.NDG_FAILED);
applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
futureRef.get().cancel(false);
shutdownScheduler(applicationId);
return;
}
// If NDG already present or marked failed
if (isNdgValid(application.getNdg()) || GepafinConstant.NDG_FAILED.equals(application.getNdgStatus())) {
log.info("NDG already present or failed for applicationId {}. Stopping polling.", applicationId);
futureRef.get().cancel(false);
shutdownScheduler(applicationId);
return;
}
// Only Visura polling here:
String visuraListJson = getVisuraList(application.getIdVisura(), hub.getAppointmentAuthTokenId(), application, hub);
String parsedNdg = parseNdgFromVisuraListResponse(visuraListJson);
if (isNdgValid(parsedNdg)) {
log.info("Valid NDG parsed from VisuraList: {} | applicationId: {}", parsedNdg, application.getId());
company.setNdg(parsedNdg);
application.setNdg(parsedNdg);
application.setNdgStatus(GepafinConstant.NDG_GENERATED);
application.setStatus(ApplicationStatusTypeEnum.NDG.getValue());
// application.setIdVisura(visuraResponse.getIdVisura());
companyRepository.save(company);
applicationRepository.save(application);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(application).build());
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyEntity).newData(company).build());
ApplicationEvaluationEntity eval = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId());
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{{call_name}}", application.getCall().getName());
placeholders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber()));
notificationDao.sendNotificationToInstructor(placeholders, eval, NotificationTypeEnum.NDG_GENERATION);
notificationDao.sendNotificationToSuperUser(application, placeholders, NotificationTypeEnum.NDG_GENERATION);
log.info("NDG saved successfully for applicationId: {}", application.getId());
return;
}
} catch (Exception ex) {
log.error("Error during NDG polling: {}", ex.getMessage(), ex);
}
};
ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(pollingTask, fifteenMin, fifteenMin, TimeUnit.MINUTES);
futureRef.set(future);
}
public NdgResponse getNdgByVatNumber(String vatNumber, UserEntity userEntity) {
HubEntity hub=userEntity.getHub();
NdganagEntity ndganagEntity = ndganagRepository.findByVatNumber(vatNumber);
NdgResponse ndgResponse=new NdgResponse();
String jsonResponse=null;
String authorizationToken = hub.getAppointmentAuthTokenId();
if (ndganagEntity == null || ndganagEntity.getNdg() == null) {
try {
log.info("Initiating NDG retrieval by VAT number | HubId: {}, VAT: {}", hub.getId(), vatNumber);
// Prepare the NDG request
jsonResponse=getNdgFromExternalService(vatNumber, authorizationToken);
checkAndSaveNdg(jsonResponse, ndgResponse);
// Parse and return the NDG response
} catch (FeignException.Forbidden forbiddenException) {
log.error("403 Forbidden during NDG retrieval | HubId: {}", hub.getId());
logForbiddenError();
// Regenerate the token and retry
String newAuthorizationToken = regenerateTokenAndSave(hub, null);
jsonResponse= getNdgFromExternalService(vatNumber,newAuthorizationToken);
if (checkAndSaveNdg(jsonResponse, ndgResponse)) return null;
} catch (Exception e) {
log.error("Error during NDG retrieval |, HubId: {}, Message: {}", hub.getId(), e.getMessage(), e);
throw new RuntimeException("NDG retrieval failed.", e);
}
}else {
ndgResponse.setNdg(ndganagEntity.getNdg());
}
return ndgResponse;
}
private boolean checkAndSaveNdg(String jsonResponse, NdgResponse ndgResponse) {
String ndg=extractNdg(jsonResponse);
if (ndg==null){
return true;
}
else {
ndgResponse.setNdg(ndg);
}
return false;
}
private String getNdgFromExternalService(String vatNumber, String authorizationToken) {
AppointmentNdgRequest ndgRequest = getAppointmentNdgRequest(vatNumber);
// Call the API to retrieve NDG
ResponseEntity<Object> response = appointmentApiService.getNdgByVatNumber(ndgRequest, authorizationToken);
String responseJson = Utils.convertObjectToJson(response.getBody());
return responseJson;
}
}

View File

@@ -491,6 +491,7 @@ public class AssignedApplicationsDao {
response.setCreatedDate(view.getCreatedDate()); response.setCreatedDate(view.getCreatedDate());
response.setUpdatedDate(view.getUpdatedDate()); response.setUpdatedDate(view.getUpdatedDate());
response.setEmailSendResponse(view.getEmailSendResponse()); response.setEmailSendResponse(view.getEmailSendResponse());
response.setAssignedUserName(view.getAssignedUserName());
return response; return response;
} }

View File

@@ -224,6 +224,10 @@ public class CallDao {
callEntity.setHub(userEntity.getHub()); callEntity.setHub(userEntity.getHub());
callEntity.setNumberOfCheck(createCallRequest.getNumberOfCheck()); callEntity.setNumberOfCheck(createCallRequest.getNumberOfCheck());
callEntity.setAppointmentTemplateId(createCallRequest.getAppointmentTemplateId()); callEntity.setAppointmentTemplateId(createCallRequest.getAppointmentTemplateId());
callEntity.setAllowMultipleApplications(false);
if (createCallRequest.getAllowMultipleApplications() != null) {
callEntity.setAllowMultipleApplications(createCallRequest.getAllowMultipleApplications());
}
callEntity = callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
log.info("CallEntity saved with ID: {} for call name: '{}'", callEntity.getId(), callEntity.getName()); log.info("CallEntity saved with ID: {} for call name: '{}'", callEntity.getId(), callEntity.getName());
@@ -406,6 +410,7 @@ public class CallDao {
createCallResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested()); createCallResponseBean.setDocumentationRequested(callEntity.getDocumentationRequested());
createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea());
createCallResponseBean.setConfidi(callEntity.getConfidi()); createCallResponseBean.setConfidi(callEntity.getConfidi());
createCallResponseBean.setAllowMultipleApplications(callEntity.getAllowMultipleApplications());
createCallResponseBean.setAmountMin(callEntity.getAmountMin()); createCallResponseBean.setAmountMin(callEntity.getAmountMin());
createCallResponseBean.setPhoneNumber(callEntity.getPhoneNumber()); createCallResponseBean.setPhoneNumber(callEntity.getPhoneNumber());
createCallResponseBean.setEndTime(callEntity.getEndTime()); createCallResponseBean.setEndTime(callEntity.getEndTime());
@@ -623,19 +628,19 @@ public class CallDao {
if (dates.size() > 0) { if (dates.size() > 0) {
setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0)); setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0));
} }
if (dates.size() > 1) { // if (dates.size() > 1) {
LocalDate requestEndDate = dates.get(1).toLocalDate(); // Extract only the date // LocalDate requestEndDate = dates.get(1).toLocalDate(); // Extract only the date
LocalDate storedEndDate = callEntity.getEndDate().toLocalDate(); // Extract only the date // LocalDate storedEndDate = callEntity.getEndDate().toLocalDate(); // Extract only the date
//
if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different // if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different
//
setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); // setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1));
// callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); //// callEntity.setStatus(CallStatusEnum.PUBLISH.getValue());
// callRepository.save(callEntity); //// callRepository.save(callEntity);
isEndDateUpdated = true; // isEndDateUpdated = true;
} // }
} // }
} // }
if (updateCallRequest.getEndTime() != null) { if (updateCallRequest.getEndTime() != null) {
LocalTime requestEndTime = DateTimeUtil.parseTime(updateCallRequest.getEndTime()); LocalTime requestEndTime = DateTimeUtil.parseTime(updateCallRequest.getEndTime());
@@ -647,6 +652,29 @@ public class CallDao {
// callRepository.save(callEntity); // callRepository.save(callEntity);
isEndTimeUpdated = true; isEndTimeUpdated = true;
} }
}
if (dates.size() > 1) {
LocalDate requestEndDate = dates.get(1).toLocalDate(); // Extract only the date
LocalDate storedEndDate = callEntity.getEndDate().toLocalDate(); // Extract only the date
if (!requestEndDate.equals(storedEndDate)) {
// Check if dates are different
setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1));
if(callEntity.getStatus().equals(CallStatusEnum.EXPIRED.getValue())) {
LocalDateTime newEndDate = LocalDateTime.of(requestEndDate, callEntity.getEndTime());
if(newEndDate.isBefore(LocalDateTime.now())){
throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.END_DATE_GREATER_THAN_NOW));
}
if (requestEndDate.isAfter(LocalDate.now()) || requestEndDate.isEqual(LocalDate.now())) {
callEntity.setStatus(CallStatusEnum.PUBLISH.getValue());
callRepository.save(callEntity);
}
}
isEndDateUpdated = true;
}
}
} }
if (isEndDateUpdated || isEndTimeUpdated) { if (isEndDateUpdated || isEndTimeUpdated) {
callRepository.save(callEntity); callRepository.save(callEntity);
@@ -683,6 +711,7 @@ public class CallDao {
setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue()); setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue());
setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck()); setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck());
setIfUpdated(callEntity::getAppointmentTemplateId, callEntity::setAppointmentTemplateId, updateCallRequest.getAppointmentTemplateId()); setIfUpdated(callEntity::getAppointmentTemplateId, callEntity::setAppointmentTemplateId, updateCallRequest.getAppointmentTemplateId());
setIfUpdated(callEntity::getAllowMultipleApplications, callEntity::setAllowMultipleApplications, updateCallRequest.getAllowMultipleApplications());
callEntity = callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "update call step 1" operation **/ /** This code is responsible for adding a version history log for the "update call step 1" operation **/
@@ -792,6 +821,7 @@ public class CallDao {
callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate());
callDetailsResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); callDetailsResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck());
callDetailsResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId()); callDetailsResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId());
callDetailsResponseBean.setAllowMultipleApplications(callEntity.getAllowMultipleApplications());
return callDetailsResponseBean; return callDetailsResponseBean;
} }

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao;
import org.springframework.data.domain.Pageable; // Correct package import org.springframework.data.domain.Pageable; // Correct package
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -531,7 +532,11 @@ public class CompanyDao {
Map<String, Object> dataMap = Utils.extractMap(companyDataMap, "data"); Map<String, Object> dataMap = Utils.extractMap(companyDataMap, "data");
Object dataObj = companyDataMap.get("data"); Object dataObj = companyDataMap.get("data");
if (dataMap == null) { if (dataObj instanceof Map<?, ?> singleMap) {
dataMap = (Map<String, Object>) singleMap;
} else if (dataObj instanceof List<?> list && !list.isEmpty() && list.get(0) instanceof Map<?, ?> firstMap) {
dataMap = (Map<String, Object>) firstMap;
} else {
log.warn("Company ID {}: 'data' section is missing or invalid in the JSON.", company.getId()); log.warn("Company ID {}: 'data' section is missing or invalid in the JSON.", company.getId());
return; return;
} }
@@ -540,11 +545,11 @@ public class CompanyDao {
updateCodiceAtecoField(company); updateCodiceAtecoField(company);
} else { } else {
Object pecEmail = Utils.extractMap(dataMap, "pec"); Object pecEmail = dataMap.get("pec");
if (pecEmail == null) { if (pecEmail == null) {
log.warn("Company ID {}: 'pec' section is missing or invalid.", company.getId()); log.warn("Company ID {}: 'pec' section is missing or invalid.", company.getId());
company.setPec((String) pecEmail);
} }
company.setPec((String) pecEmail);
// Extract 'atecoClassification' section // Extract 'atecoClassification' section
Map<String, Object> atecoClassificationMap = Utils.extractMap(dataMap, "atecoClassification"); Map<String, Object> atecoClassificationMap = Utils.extractMap(dataMap, "atecoClassification");
@@ -577,49 +582,79 @@ public class CompanyDao {
} }
public void getCompanyEntity() { public void getCompanyEntity() {
List<CompanyEntity> companyEntities=companyRepository.findAll(); List<CompanyEntity> companyEntities=companyRepository.findByJsonIsNotNullAndPecIsNull();
List<CompanyEntity> companyEntityList=new ArrayList<>();
for (CompanyEntity company:companyEntities){ for (CompanyEntity company:companyEntities){
if(company.getJson()!=null){ if(company.getJson()!=null && company.getPec()==null){
if (company == null || company.getJson() == null || company.getJson().isEmpty()) { if (company == null || company.getJson() == null || company.getJson().isEmpty()) {
log.warn("Company is null or JSON data is empty."); log.warn("Company is null or JSON data is empty.");
return; continue;
} }
Map<String, Object> vatCheckResponse = Utils.convertJsonStringToMap(company.getJson()); Map<String, Object> vatCheckResponse = Utils.convertJsonStringToMap(company.getJson());
if (vatCheckResponse == null) { if (vatCheckResponse == null) {
log.warn("Company ID {}: Invalid JSON response.", company.getId()); log.warn("Company ID {}: Invalid JSON response.", company.getId());
return; continue;
} }
Map<String, Object> companyDataMap = Utils.convertJsonStringToMap(company.getJson()); Map<String, Object> companyDataMap = Utils.convertJsonStringToMap(company.getJson());
if (companyDataMap == null) { if (companyDataMap == null) {
log.warn("Company ID {}: Failed to parse JSON data.", company.getId()); log.warn("Company ID {}: Failed to parse JSON data.", company.getId());
return; continue;
} }
Object dataObj = vatCheckResponse.get("data"); Object dataObj = vatCheckResponse.get("data");
if (!(dataObj instanceof Map<?, ?> dataMap)) { Map<String, Object> dataMap=null;
log.warn("Company ID {}: 'data' is missing or not a valid object.", company.getId()); // if (!(dataObj instanceof Map<?, ?> dataMap)) {
return; // log.warn("Company ID {}: 'data' is missing or not a valid object.", company.getId());
// continue;
// }
if (dataObj instanceof Map<?, ?> singleMap) {
dataMap = (Map<String, Object>) singleMap;
} else if (dataObj instanceof List<?> list && !list.isEmpty() && list.get(0) instanceof Map<?, ?> firstMap) {
dataMap = (Map<String, Object>) firstMap;
} else {
log.warn("Company ID {}: 'data' section is missing or invalid in the JSON.", company.getId());
continue;
} }
if (dataMap.containsKey("pec")) {
Object pecEmailObj = dataMap.get("pec");
if (pecEmailObj instanceof String pec && !pec.isEmpty()) {
company.setPec(pec); // Only set if valid string
companyEntityList.add(company);
} else {
log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId());
continue;
}
}
if (!dataMap.containsKey("dettaglio")) { if (!dataMap.containsKey("dettaglio")) {
log.warn("Company ID {}: 'dettaglio' not present inside 'data'. Skipping codiceAteco update.", company.getId()); log.warn("Company ID {}: 'dettaglio' not present inside 'data'. Skipping codiceAteco update.", company.getId());
return; continue;
} }
Object dettaglioObj = dataMap.get("dettaglio"); Object dettaglioObj = dataMap.get("dettaglio");
if (!(dettaglioObj instanceof Map<?, ?> dettaglio)) { if (!(dettaglioObj instanceof Map<?, ?> dettaglio)) {
log.warn("Company ID {}: 'dettaglio' is not a valid object.", company.getId()); log.warn("Company ID {}: 'dettaglio' is not a valid object.", company.getId());
return; continue;
} }
Object pecEmailObj = dettaglio.get("pec"); Object pecEmailObj = dettaglio.get("pec");
if (pecEmailObj instanceof String pec && !pec.isEmpty()) { if (pecEmailObj instanceof String pec && !pec.isEmpty()) {
if(pec!=null) {
company.setPec(pec); // Only set if valid string company.setPec(pec); // Only set if valid string
companyEntityList.add(company);
}
} else { } else {
log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId()); log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId());
continue;
} }
} }
} }
companyRepository.saveAll(companyEntityList);
} }
} }

View File

@@ -1,13 +1,19 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.AmendmentFormField;
import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.model.response.ContentResponseBean;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.model.response.SettingResponseBean;
import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -17,13 +23,8 @@ import org.springframework.web.multipart.MultipartFile;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean;
import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.DocumentRepository;
import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
@@ -31,8 +32,6 @@ import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import java.util.ArrayList;
import java.util.List;
@Slf4j @Slf4j
@@ -78,6 +77,18 @@ public class DocumentDao {
@Autowired @Autowired
private HttpServletRequest request; private HttpServletRequest request;
@Autowired
private ApplicationFormRepository applicationFormRepository;
@Autowired
private ApplicationFormFieldRepository applicationFormFieldRepository;
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
@Autowired
private ApplicationEvaluationDao applicationEvaluationDao;
// @Value("${aws.s3.url.folder}") // @Value("${aws.s3.url.folder}")
// private String s3Folder; // private String s3Folder;
@@ -224,18 +235,72 @@ public class DocumentDao {
} else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(documentEntity.getSource())) { } else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(documentEntity.getSource())) {
applicationId = documentEntity.getSourceId(); applicationId = documentEntity.getSourceId();
ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId);
List<ApplicationFormEntity> applicationFormEntity=applicationFormRepository.findByApplicationId(applicationId);
for (ApplicationFormEntity applicationForm:applicationFormEntity){
FormEntity formEntity=applicationForm.getForm();
List<ContentResponseBean> contentList = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class);
List<ApplicationFormFieldEntity> applicationFormFieldEntityList=applicationFormFieldRepository.findByApplicationFormId(applicationForm.getId());
for (ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) {
contentList.forEach(contentResponseBean -> {
if (("fileupload".equals(contentResponseBean.getName()) || GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName()))
&& contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId())) {
String updatedValue = removeDocumentIdFromFieldValue(applicationFormFieldEntity.getFieldValue(), documentId);
applicationFormFieldEntity.setFieldValue(updatedValue);
applicationFormFieldRepository.save(applicationFormFieldEntity);
}
});
}
}
callId = applicationEntity.getCall().getId(); callId = applicationEntity.getCall().getId();
log.info("Processing document of type APPLICATION. Resolved applicationId={}, callId={}", applicationId, callId); log.info("Processing document of type APPLICATION. Resolved applicationId={}, callId={}", applicationId, callId);
} }
else if(DocumentSourceTypeEnum.AMENDMENT.getValue().equalsIgnoreCase(documentEntity.getSource())){ else if(DocumentSourceTypeEnum.AMENDMENT.getValue().equalsIgnoreCase(documentEntity.getSource())){
amendmentId = documentEntity.getSourceId(); amendmentId = documentEntity.getSourceId();
ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
Optional<ApplicationAmendmentRequestEntity> applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId);
Map<String, AmendmentFormField> amendmentFormFieldMap = Utils
.convertJsonStringToList(applicationAmendmentRequestEntity.get().getFormFields(), AmendmentFormField.class)
.stream().collect(Collectors.toMap(AmendmentFormField::getFieldId, Function.identity()));
for (Map.Entry<String, AmendmentFormField> entry : amendmentFormFieldMap.entrySet()) {
AmendmentFormField amendmentFormField=entry.getValue();
String updatedValue = removeDocumentIdFromFieldValue(amendmentFormField.getFieldValue(), documentId);
amendmentFormField.setFieldValue(updatedValue);
}
String amendmentDocs=applicationAmendmentRequestEntity.get().getAmendmentDocument();
Map<String,Object> amendmentDocument=Utils.convertIntoJson(amendmentDocs);
String amendmentDocuments= (String) amendmentDocument.get("amendmentDocuments");
if(amendmentDocuments!=null){
String updatedValue = removeDocumentIdFromFieldValue(amendmentDocuments, documentId);
amendmentDocument.put("amendmentDocuments", updatedValue);
// Step 4: Convert map back to JSON string
String updatedAmendmentDocs = Utils.convertMapIntoJsonString(amendmentDocument); // implement this if not available
// Step 5: Set it back to entity
applicationAmendmentRequestEntity.get().setAmendmentDocument(updatedAmendmentDocs);
}
applicationAmendmentRequestEntity.get().setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList()));
applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity.get());
applicationId = applicationEntity.getId(); applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId(); callId = applicationEntity.getCall().getId();
log.info("Processing document of type AMENDMENT. Resolved amendmentId={}, applicationId={}, callId={}", amendmentId, applicationId, callId); log.info("Processing document of type AMENDMENT. Resolved amendmentId={}, applicationId={}, callId={}", amendmentId, applicationId, callId);
} else if(DocumentSourceTypeEnum.EVALUATION.getValue().equalsIgnoreCase(documentEntity.getSource())){ } else if(DocumentSourceTypeEnum.EVALUATION.getValue().equalsIgnoreCase(documentEntity.getSource())){
evaluationId = documentEntity.getSourceId(); evaluationId = documentEntity.getSourceId();
ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId); ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId);
ApplicationEvaluationEntity entity=applicationEvaluationRepository.findByApplicationId(applicationEntity.getId());
List<EvaluationDocumentRequest> allDocs = applicationEvaluationDao.prepareEvaluationDocumentBeanList(entity);
List<EvaluationDocumentRequest> updatedDocs=allDocs;
allDocs = allDocs.stream()
.filter(doc -> doc.getFileValue().equals(removeDocumentIdFromFieldValue(doc.getFileValue(), documentId)))
.collect(Collectors.toList());
String updatedEvaluationDocJson = Utils.convertObjectToJson(allDocs);
entity.setEvaluationDocument(updatedEvaluationDocJson);
applicationEvaluationRepository.save(entity);
applicationId = applicationEntity.getId(); applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId(); callId = applicationEntity.getCall().getId();
log.info("Processing document of type EVALUATION. Resolved evaluationId={}, applicationId={}, callId={}", evaluationId, applicationId, callId); log.info("Processing document of type EVALUATION. Resolved evaluationId={}, applicationId={}, callId={}", evaluationId, applicationId, callId);
@@ -343,4 +408,19 @@ public class DocumentDao {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.ERROR_MOVING_FILE_TO_DELETED_FOLDER)); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.ERROR_MOVING_FILE_TO_DELETED_FOLDER));
} }
} }
public String removeDocumentIdFromFieldValue(String fieldValue, Long documentId) {
if (fieldValue == null || fieldValue.isBlank()) {
return fieldValue;
}
List<String> documentIdList = new ArrayList<>(Arrays.asList(fieldValue.split(",")));
documentIdList.replaceAll(String::trim); // Trim spaces for safety
boolean removed = documentIdList.removeIf(id -> id.equals(String.valueOf(documentId)));
// Return updated value only if modified, else return original
return removed ? String.join(",", documentIdList) : fieldValue;
}
} }

View File

@@ -67,9 +67,15 @@ public class EmailNotificationDao {
@Autowired @Autowired
private ApplicationEvaluationRepository applicationEvaluationRepository; private ApplicationEvaluationRepository applicationEvaluationRepository;
@Value("${default.hub.uuid}")
private String defaultHubUuid;
@Value("${rinaldo_email}") @Value("${rinaldo_email}")
private String rinaldoEmail; private String rinaldoEmail;
@Autowired
private SystemEmailTemplatesDao systemEmailTemplatesDao;
private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, Map<String, String> bodyPlaceholders, private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, Map<String, String> bodyPlaceholders,
List<String> additionalRecipients, Long amendmentId) { List<String> additionalRecipients, Long amendmentId) {
@@ -109,7 +115,18 @@ public class EmailNotificationDao {
UserWithCompanyEntity userWithCompany=companyService.getUserWithCompany(userEntity.getId(),company.getId()); UserWithCompanyEntity userWithCompany=companyService.getUserWithCompany(userEntity.getId(),company.getId());
String companyEmail = userWithCompany.getEmail(); String companyEmail = userWithCompany.getEmail();
String contactEmail = userWithCompany.getContactEmail(); String contactEmail = userWithCompany.getContactEmail();
if (Boolean.TRUE.equals(userEntity.getHub().getUniqueUuid().equals(defaultHubUuid))){
List<String> recipientEmails=new ArrayList<>();
if (company.getPec()!=null) {
recipientEmails.add(company.getPec());
}else {
recipientEmails.add(userWithCompany.getPec());
}
EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY,company.getId() ,
String.valueOf(recipientEmails), userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId());
sendMail(applicationEntity.getHubId(), subject, body, recipientEmails, emailLogRequest);
}
else {
if (companyEmail != null && !companyEmail.isEmpty()) { if (companyEmail != null && !companyEmail.isEmpty()) {
EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY, company.getId(), EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY, company.getId(),
companyEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); companyEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId());
@@ -120,9 +137,15 @@ public class EmailNotificationDao {
contactEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); contactEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId());
sendMail(applicationEntity.getHubId(), subject, body, List.of(contactEmail), emailLogRequest); sendMail(applicationEntity.getHubId(), subject, body, List.of(contactEmail), emailLogRequest);
} }
}
if (userEntity.getBeneficiary().getEmail() != null) { if (userEntity.getBeneficiary().getEmail() != null) {
String beneficiaryEmail = userEntity.getBeneficiary().getEmail(); String beneficiaryEmail = null;
if (Boolean.TRUE.equals(userEntity.getHub().getUniqueUuid().equals(defaultHubUuid))){
beneficiaryEmail=applicationEntity.getPecEmail();
}else {
beneficiaryEmail=userEntity.getBeneficiary().getEmail();
}
EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId() , EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId() ,
beneficiaryEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); beneficiaryEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId());
sendMail(applicationEntity.getHubId(), subject, body, List.of(beneficiaryEmail), emailLogRequest); sendMail(applicationEntity.getHubId(), subject, body, List.of(beneficiaryEmail), emailLogRequest);
@@ -174,8 +197,16 @@ public class EmailNotificationDao {
public Map<String, String> prepareEmailPlaceholders(ApplicationEntity applicationEntity, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ public Map<String, String> prepareEmailPlaceholders(ApplicationEntity applicationEntity, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){
protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{protocol_date}}", protocolDate);
bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS));
bodyPlaceholders.put("{{response_days}}", applicationAmendmentRequestEntity.getResponseDays().toString()); bodyPlaceholders.put("{{response_days}}", applicationAmendmentRequestEntity.getResponseDays().toString());
@@ -259,8 +290,16 @@ public class EmailNotificationDao {
public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) { public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) {
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){
protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{protocol_date}}", protocolDate);
bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS));
sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,null); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,null);
@@ -269,8 +308,16 @@ public class EmailNotificationDao {
public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) {
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber();
bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); if(protocolNumber==null){
protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){
protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{protocol_date}}", protocolDate);
bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS));
bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation()); bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation());
@@ -311,4 +358,30 @@ public class EmailNotificationDao {
throw new IllegalArgumentException("Failed to parse email configuration JSON", e); throw new IllegalArgumentException("Failed to parse email configuration JSON", e);
} }
} }
public void sendMailForApplicationTechnicalEvaluationRejected(ApplicationEntity applicationEntity,HubEntity hub,ApplicationEvaluationEntity applicationEvaluationEntity) {
Map<String, String> bodyPlaceholders = prepareEmailPlaceholdersForTechnicalEvaluationRejected(applicationEntity,hub,applicationEvaluationEntity);
sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_TECHNICAL_EVALUATION_FAILURE, bodyPlaceholders, null,
null);
}
public Map<String, String> prepareEmailPlaceholdersForTechnicalEvaluationRejected(ApplicationEntity applicationEntity,HubEntity hub,ApplicationEvaluationEntity applicationEvaluationEntity) {
Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
String protocolNumber = applicationEntity.getProtocol().getExternalProtocolNumber();
if (protocolNumber == null) {
protocolNumber = String.valueOf(applicationEntity.getProtocol().getProtocolNumber());
}
bodyPlaceholders.put("{{protocol_number}}", protocolNumber);
String protocolDate = DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY);
if (applicationEntity.getProtocol().getExternalProtocolDate() != null) {
protocolDate = DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY);
}
bodyPlaceholders.put("{{protocol_date}}", protocolDate);
bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS));
bodyPlaceholders.put("{{email_signature}}", hub.getEmailSignature());
bodyPlaceholders.put("{{platform_link}}", hub.getDomainName());
bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation());
return bodyPlaceholders;
}
} }

View File

@@ -174,7 +174,11 @@ public class NotificationDao {
Map<String, String> placeHolders = new HashMap<>(); Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName()); placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); String protocolNumber=application.getProtocol().getExternalProtocolNumber();
if(protocolNumber==null){
protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber());
}
placeHolders.put("{{protocol_number}}", protocolNumber);
NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, application.getUserId(), application.getUserWithCompany(), NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, application.getUserId(), application.getUserWithCompany(),
listOf(application.getCompanyId())); listOf(application.getCompanyId()));
sendNotification(notificationReq); sendNotification(notificationReq);

View File

@@ -89,6 +89,9 @@ public class ProtocolDao {
@Value("${tipoCorrispondente}") @Value("${tipoCorrispondente}")
private String tipoCorrispondente; private String tipoCorrispondente;
@Value("${isSviluppumbriaProtocolEnabled}")
private String isSviluppUmbriaProtocolEnabled;
@Autowired @Autowired
private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; private ApplicationSignedDocumentRepository applicationSignedDocumentRepository;
@@ -156,6 +159,11 @@ public class ProtocolDao {
} }
public ProtocolEntity createExternalProtocol(ApplicationEntity application, CompanyEntity company, ProtocolEntity protocol) { public ProtocolEntity createExternalProtocol(ApplicationEntity application, CompanyEntity company, ProtocolEntity protocol) {
if (Boolean.FALSE.equals(Boolean.parseBoolean(isSviluppUmbriaProtocolEnabled))) {
return protocol;
}
log.info("Starting createExternalProtocol for application ID: {}", application.getId()); log.info("Starting createExternalProtocol for application ID: {}", application.getId());
log.debug("Successfully retrieved bearer token"); log.debug("Successfully retrieved bearer token");
@@ -176,20 +184,20 @@ public class ProtocolDao {
String callName = application.getCall().getName()+" "+ application.getCall().getId(); String callName = application.getCall().getName()+" "+ application.getCall().getId();
String callId = GepafinConstant.PROTOCOL_CALL_NAME+ String.valueOf(application.getCall().getId()); String callId = GepafinConstant.PROTOCOL_CALL_NAME+ String.valueOf(application.getCall().getId());
String pecEmail=company.getPec(); String pecEmail=company.getPec();
String docUrl=applicationSignedDocumentEntity.getFilePath(); String docUrl=applicationSignedDocumentEntity.getFilePath()+GepafinConstant.PROTOCOL_DOC_SUFFIX;
Map<String, Object> requestBody = new HashMap<>(); Map<String, Object> requestBody = new HashMap<>();
requestBody.put(GepafinConstant.PROTOCOL_DOC_URL,docUrl); requestBody.put(GepafinConstant.PROTOCOL_DOC_URL,docUrl);
requestBody.put(GepafinConstant.PROTOCOL_COMPANY_NAME,companyName);
requestBody.put(GepafinConstant.PROTOCOL_DOC_HASH,applicationSignedDocumentEntity.getFileHash()); requestBody.put(GepafinConstant.PROTOCOL_DOC_HASH,applicationSignedDocumentEntity.getFileHash());
requestBody.put(GepafinConstant.PROTOCOL_TIPO_PROTOCOLLAZIONE,TIPO_PROTOCOLLAZIONE); requestBody.put(GepafinConstant.PROTOCOL_TIPO_PROTOCOLLAZIONE,TIPO_PROTOCOLLAZIONE);
requestBody.put(GepafinConstant.PROTOCOL_COMPANY_NAME_VAT_NUMBER,company.getCompanyName());
Map<String, Object> mittente = new HashMap<>(); Map<String, Object> mittente = new HashMap<>();
mittente.put(GepafinConstant.PROTOCOL_TIPO_CORRISPONDENTE_COMPANY, mittenteValue); mittente.put(GepafinConstant.PROTOCOL_TIPO_CORRISPONDENTE, mittenteValue);
mittente.put(GepafinConstant.PROTOCOL_COMPANY_NAME_VAT_NUMBER,company.getCompanyName());
mittente.put(GepafinConstant.PROTOCOL_MEZZO,mezzo); mittente.put(GepafinConstant.PROTOCOL_MEZZO,mezzo);
mittente.put(GepafinConstant.PROTOCOL_INDIRIZZO_PEC,pecEmail); mittente.put(GepafinConstant.PROTOCOL_INDIRIZZO_PEC,pecEmail);
mittente.put(GepafinConstant.PROTOCOL_COMPANY_VAT_NUMBER,vatNumber); mittente.put(GepafinConstant.PROTOCOL_COMPANY_VAT_NUMBER,vatNumber);
mittente.put(GepafinConstant.PROTOCOL_COMPANY_NAME,company.getCompanyName());
List<Map<String,Object>> destinatariObject=new ArrayList<>(); List<Map<String,Object>> destinatariObject=new ArrayList<>();
Map<String, Object> destinatari = new HashMap<>(); Map<String, Object> destinatari = new HashMap<>();
destinatari.put(GepafinConstant.PROTOCOL_CODICE_UO,codiceUo); destinatari.put(GepafinConstant.PROTOCOL_CODICE_UO,codiceUo);

View File

@@ -116,7 +116,7 @@ public class SystemEmailTemplatesDao {
return htmlContent; return htmlContent;
} }
private String replaceEmailSignature(HubEntity hub, String htmlContent, Map<String, String> languageMap) { public String replaceEmailSignature(HubEntity hub, String htmlContent, Map<String, String> languageMap) {
String emailSignature = defaultEmailSignature; String emailSignature = defaultEmailSignature;
if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getEmailSignature()))){ if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getEmailSignature()))){
emailSignature = hub.getEmailSignature(); emailSignature = hub.getEmailSignature();
@@ -124,7 +124,7 @@ public class SystemEmailTemplatesDao {
return htmlContent.replace("{{email_signature}}", emailSignature); return htmlContent.replace("{{email_signature}}", emailSignature);
} }
private String replacePlatformLinkPlaceholder(HubEntity hub, String htmlContent, Map<String, String> languageMap) { public String replacePlatformLinkPlaceholder(HubEntity hub, String htmlContent, Map<String, String> languageMap) {
String platformLink = feBaseUrl; String platformLink = feBaseUrl;
if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))){ if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))){
platformLink = hub.getDomainName(); platformLink = hub.getDomainName();

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import net.gepafin.tendermanagement.model.response.EmailSendResponse; import net.gepafin.tendermanagement.model.response.EmailSendResponse;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -10,6 +11,7 @@ import java.util.List;
@Entity @Entity
@Table(name="application_amendment_request") @Table(name="application_amendment_request")
@Data @Data
@Where(clause = "is_deleted = false")
public class ApplicationAmendmentRequestEntity extends BaseEntity { public class ApplicationAmendmentRequestEntity extends BaseEntity {
@Column(name = "NOTE") @Column(name = "NOTE")
@@ -33,9 +35,6 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity {
@Column(name = "FORM_FIELDS") @Column(name = "FORM_FIELDS")
private String formFields; private String formFields;
@Column(name="IS_DELETED")
private Boolean isDeleted=false;
@Column(name = "STATUS") @Column(name = "STATUS")
private String status; private String status;

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import org.hibernate.annotations.Where;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -9,6 +10,7 @@ import java.time.LocalDateTime;
@Entity @Entity
@Table(name = "APPLICATION") @Table(name = "APPLICATION")
@Data @Data
@Where(clause = "is_deleted = false")
public class ApplicationEntity extends BaseEntity { public class ApplicationEntity extends BaseEntity {
@Column(name = "USER_ID") @Column(name = "USER_ID")
@@ -30,9 +32,6 @@ public class ApplicationEntity extends BaseEntity {
@JoinColumn(name = "CALL_ID", nullable = false) @JoinColumn(name = "CALL_ID", nullable = false)
private CallEntity call; private CallEntity call;
@Column(name="IS_DELETED")
private Boolean isDeleted;
@OneToOne @OneToOne
@JoinColumn(name = "PROTOCOL_NUMBER") @JoinColumn(name = "PROTOCOL_NUMBER")
private ProtocolEntity protocol; private ProtocolEntity protocol;
@@ -74,4 +73,10 @@ public class ApplicationEntity extends BaseEntity {
@Column(name = "APPLICATION_EVALUATION_ID") @Column(name = "APPLICATION_EVALUATION_ID")
private Long applicationEvaluationId; private Long applicationEvaluationId;
@Column(name = "PEC_EMAIL")
private String pecEmail;
@Column(name="VAT_NUMBER")
private String vatNumber;
} }

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import net.gepafin.tendermanagement.model.response.EmailSendResponse; import net.gepafin.tendermanagement.model.response.EmailSendResponse;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -10,6 +11,7 @@ import java.util.List;
@Data @Data
@Entity @Entity
@Table(name = "application_evaluation") @Table(name = "application_evaluation")
@Where(clause = "is_deleted = false")
public class ApplicationEvaluationEntity extends BaseEntity{ public class ApplicationEvaluationEntity extends BaseEntity{
@Column(name = "application_Id") @Column(name = "application_Id")
@@ -39,9 +41,6 @@ public class ApplicationEvaluationEntity extends BaseEntity{
@Column(name = "MOTIVATION") @Column(name = "MOTIVATION")
private String motivation; private String motivation;
@Column(name="IS_DELETED")
private Boolean isDeleted;
@ManyToOne @ManyToOne
@JoinColumn(name = "assigned_applications_id", nullable = true) @JoinColumn(name = "assigned_applications_id", nullable = true)
private AssignedApplicationsEntity assignedApplicationsEntity; private AssignedApplicationsEntity assignedApplicationsEntity;

View File

@@ -2,16 +2,15 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Data @Data
@Table(name = "APPLICATION_EVALUATION_FORM") @Table(name = "APPLICATION_EVALUATION_FORM")
@Where(clause = "is_deleted = false")
public class ApplicationEvaluationFormEntity extends BaseEntity{ public class ApplicationEvaluationFormEntity extends BaseEntity{
private Long applicationId; private Long applicationId;
@Column(name="IS_DELETED")
private Boolean isDeleted;
@ManyToOne @ManyToOne
@JoinColumn(name = "EVALUATION_ID") @JoinColumn(name = "EVALUATION_ID")
private ApplicationEvaluationEntity applicationEvaluation; private ApplicationEvaluationEntity applicationEvaluation;

View File

@@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Data @Data
@Table(name = "APPLICATION_EVALUATION_FORM_FIELD") @Table(name = "APPLICATION_EVALUATION_FORM_FIELD")
@Where(clause = "is_deleted = false")
public class ApplicationEvaluationFormFieldEntity extends BaseEntity { public class ApplicationEvaluationFormFieldEntity extends BaseEntity {
@ManyToOne @ManyToOne
@@ -18,7 +20,4 @@ public class ApplicationEvaluationFormFieldEntity extends BaseEntity {
@Column(name = "FIELD_VALUE") @Column(name = "FIELD_VALUE")
private String fieldValue; private String fieldValue;
@Column(name="IS_DELETED")
private Boolean isDeleted;
} }

View File

@@ -2,11 +2,12 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "APPLICATION_FORM") @Table(name = "APPLICATION_FORM")
@Data @Data
@Where(clause = "is_deleted = false")
public class ApplicationFormEntity extends BaseEntity { public class ApplicationFormEntity extends BaseEntity {
@ManyToOne @ManyToOne

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -11,6 +12,7 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class ApplicationFormFieldEntity extends BaseEntity { public class ApplicationFormFieldEntity extends BaseEntity {
@ManyToOne @ManyToOne

View File

@@ -115,4 +115,12 @@ public class ApplicationFormView {
@Column(name = "call_start_time") @Column(name = "call_start_time")
private LocalTime callStartTime; private LocalTime callStartTime;
@Column(name = "INSTRUCTOR_NAME")
private String instructorName;
@Column(name = "SUBMISSION_DATE")
private LocalDate submissionDate;
@Column(name = "SUBMISSION_TIME")
private LocalTime submissionTime;
} }

View File

@@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Data @Data
@Entity @Entity
@Table(name = "application_signed_document") @Table(name = "application_signed_document")
@Where(clause = "is_deleted = false")
public class ApplicationSignedDocumentEntity extends BaseEntity { public class ApplicationSignedDocumentEntity extends BaseEntity {
@ManyToOne @ManyToOne

View File

@@ -2,13 +2,14 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Data @Data
@Table(name = "assigned_applications") @Table(name = "assigned_applications")
@Where(clause = "is_deleted = false")
public class AssignedApplicationsEntity extends BaseEntity{ public class AssignedApplicationsEntity extends BaseEntity{
@ManyToOne @ManyToOne
@@ -27,9 +28,7 @@ public class AssignedApplicationsEntity extends BaseEntity{
@Column(name = "NOTE") @Column(name = "NOTE")
private String note; private String note;
@Column(name="IS_DELETED")
private Boolean isDeleted=false;
@Column(nullable = false) @Column(nullable = false)
private LocalDateTime assignedAt; private LocalDateTime assignedAt;
} }

View File

@@ -67,4 +67,7 @@ public class AssignedApplicationsView{
@Column(name = "HUB_ID") @Column(name = "HUB_ID")
private Long hubId; private Long hubId;
@Column(name="ASSIGNED_USER_NAME")
private String assignedUserName;
} }

View File

@@ -22,6 +22,11 @@ public class BaseEntity {
@Column(name = "UPDATED_DATE") @Column(name = "UPDATED_DATE")
LocalDateTime updatedDate; LocalDateTime updatedDate;
@Column(name="IS_DELETED")
private Boolean isDeleted = false;
@PrePersist @PrePersist
public void setCreatedDate() { public void setCreatedDate() {
this.createdDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); this.createdDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now());

View File

@@ -7,10 +7,12 @@ import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Email;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "BENEFICIARY") @Table(name = "BENEFICIARY")
@Data @Data
@Where(clause = "is_deleted = false")
public class BeneficiaryEntity extends BaseEntity { public class BeneficiaryEntity extends BaseEntity {
@Email @Email

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -14,6 +15,7 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class BeneficiaryPreferredCallEntity extends BaseEntity{ public class BeneficiaryPreferredCallEntity extends BaseEntity{
@Id @Id
@@ -35,9 +37,6 @@ public class BeneficiaryPreferredCallEntity extends BaseEntity{
@Column(name = "STATUS", length = 255) @Column(name = "STATUS", length = 255)
private String status; private String status;
@Column(name="IS_DELETED")
private Boolean isDeleted;
@ManyToOne @ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID") @JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany; private UserWithCompanyEntity userWithCompany;

View File

@@ -5,6 +5,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import org.hibernate.annotations.Where;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -16,6 +17,7 @@ import java.time.LocalTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class CallEntity extends BaseEntity { public class CallEntity extends BaseEntity {
@Column(name = "NAME", length = 255) @Column(name = "NAME", length = 255)
@@ -97,5 +99,8 @@ public class CallEntity extends BaseEntity {
@Column(name = "APPOINTMENT_TEMPLATE_ID") @Column(name = "APPOINTMENT_TEMPLATE_ID")
private Long appointmentTemplateId; private Long appointmentTemplateId;
@Column(name = "allow_multiple_applications")
private Boolean allowMultipleApplications;
} }

View File

@@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "CALL_TARGET_AUDIENCE_CHECKLIST") @Table(name = "CALL_TARGET_AUDIENCE_CHECKLIST")
@Data @Data
@Where(clause = "is_deleted = false")
public class CallTargetAudienceChecklistEntity extends BaseEntity{ public class CallTargetAudienceChecklistEntity extends BaseEntity{
@ManyToOne @ManyToOne
@@ -19,8 +21,4 @@ public class CallTargetAudienceChecklistEntity extends BaseEntity{
@Column(name = "IS_VALIDATED") @Column(name = "IS_VALIDATED")
private Boolean isValidated; private Boolean isValidated;
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
} }

View File

@@ -6,12 +6,14 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Table(name = "communication") @Table(name = "communication")
@Data @Data
@Where(clause = "is_deleted = false")
public class CommunicationEntity extends BaseEntity { public class CommunicationEntity extends BaseEntity {
@Column(name = "COMMUNICATION_TITLE") @Column(name = "COMMUNICATION_TITLE")
@@ -20,9 +22,6 @@ public class CommunicationEntity extends BaseEntity {
@Column(name = "COMMUNICATION_COMMENT") @Column(name = "COMMUNICATION_COMMENT")
private String communicationComment; private String communicationComment;
@Column(name = "IS_DELETED")
private Boolean isDeleted = false;
@Column(name = "COMMENTED_DATE") @Column(name = "COMMENTED_DATE")
private LocalDateTime commentedDate; private LocalDateTime commentedDate;

View File

@@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Table(name = "COMPANY_DOCUMENT") @Table(name = "COMPANY_DOCUMENT")
@Data @Data
@Where(clause = "is_deleted = false")
public class CompanyDocumentEntity extends BaseEntity { public class CompanyDocumentEntity extends BaseEntity {
@Column(name = "FILE_NAME") @Column(name = "FILE_NAME")
@@ -25,9 +27,6 @@ public class CompanyDocumentEntity extends BaseEntity {
@Column(name="COMPANY_ID") @Column(name="COMPANY_ID")
private Long companyId; private Long companyId;
@Column(name ="IS_DELETED")
private Boolean isDeleted = false;
@Column(name="UPLOADED_BY") @Column(name="UPLOADED_BY")
private Long uploadedBy; private Long uploadedBy;

View File

@@ -8,10 +8,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "COMPANY") @Table(name = "COMPANY")
@Data @Data
@Where(clause = "is_deleted = false")
public class CompanyEntity extends BaseEntity{ public class CompanyEntity extends BaseEntity{
@Column(name = "COMPANY_NAME") @Column(name = "COMPANY_NAME")

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "criteria_form_field") @Table(name = "criteria_form_field")
@Data @Data
@Where(clause = "is_deleted = false")
public class CriteriaFormFieldEntity extends BaseEntity { public class CriteriaFormFieldEntity extends BaseEntity {
private Long callId; private Long callId;
@@ -18,7 +20,4 @@ public class CriteriaFormFieldEntity extends BaseEntity {
private Long evaluationCriteriaId; private Long evaluationCriteriaId;
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
} }

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "document_category") @Table(name = "document_category")
@Data @Data
@Where(clause = "is_deleted = false")
public class DocumentCategoryEntity extends BaseEntity { public class DocumentCategoryEntity extends BaseEntity {
@Column(name = "CATEGORY_NAME") @Column(name = "CATEGORY_NAME")
@@ -16,7 +18,4 @@ public class DocumentCategoryEntity extends BaseEntity {
@Column(name = "DESCRIPTION") @Column(name = "DESCRIPTION")
private String description; private String description;
@Column(name ="IS_DELETED")
private Boolean isDeleted = false;
} }

View File

@@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "DOCUMENT") @Table(name = "DOCUMENT")
@Data @Data
@Where(clause = "is_deleted = false")
public class DocumentEntity extends BaseEntity{ public class DocumentEntity extends BaseEntity{
@Column(name = "FILE_NAME", length = 255) @Column(name = "FILE_NAME", length = 255)
private String fileName; private String fileName;
@@ -26,9 +28,6 @@ public class DocumentEntity extends BaseEntity{
@Column(name="SOURCE_ID") @Column(name="SOURCE_ID")
private Long sourceId; private Long sourceId;
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
@Column(name="DOCUMENT_ATTACHMENT_ID") @Column(name="DOCUMENT_ATTACHMENT_ID")
private String documentAttachmentId; private String documentAttachmentId;

View File

@@ -1,12 +1,14 @@
package net.gepafin.tendermanagement.entities; package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Data @Data
@Table(name = "email_log") @Table(name = "email_log")
@Where(clause = "is_deleted = false")
public class EmailLogEntity extends BaseEntity{ public class EmailLogEntity extends BaseEntity{
@Column(name = "email_type", nullable = false, length = 255) @Column(name = "email_type", nullable = false, length = 255)
@@ -54,9 +56,6 @@ public class EmailLogEntity extends BaseEntity{
@Column(name = "call_id") @Column(name = "call_id")
private Long callId; private Long callId;
@Column(name = "is_deleted")
private Boolean isDeleted;
@ManyToOne @ManyToOne
@JoinColumn(name = "user_action_id") @JoinColumn(name = "user_action_id")
private UserActionEntity userAction; private UserActionEntity userAction;

View File

@@ -5,6 +5,9 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.math.BigDecimal;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -12,6 +15,7 @@ import java.math.BigDecimal;
@Entity @Entity
@Table(name = "EVALUATION_CRITERIA") @Table(name = "EVALUATION_CRITERIA")
@Data @Data
@Where(clause = "is_deleted = false")
public class EvaluationCriteriaEntity extends BaseEntity { public class EvaluationCriteriaEntity extends BaseEntity {
@ManyToOne @ManyToOne

View File

@@ -5,12 +5,15 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "EVALUATION_FORM") @Table(name = "EVALUATION_FORM")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class EvaluationFormEntity extends BaseEntity{ public class EvaluationFormEntity extends BaseEntity{
@@ -24,6 +27,4 @@ public class EvaluationFormEntity extends BaseEntity{
@Column(name = "CONTENT") @Column(name = "CONTENT")
private String content; private String content;
@Column(name="IS_DELETED")
private Boolean isDeleted;
} }

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "expiration_config") @Table(name = "expiration_config")
@Data @Data
@Where(clause = "is_deleted = false")
public class ExpirationConfigEntity extends BaseEntity { public class ExpirationConfigEntity extends BaseEntity {
@Column(name="INTERVAL_DAYS") @Column(name="INTERVAL_DAYS")
@@ -15,7 +17,4 @@ public class ExpirationConfigEntity extends BaseEntity {
@Column(name="TYPE") @Column(name="TYPE")
private String type; private String type;
@Column(name="IS_DELETED")
private Boolean isDeleted;
} }

View File

@@ -9,11 +9,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "FAQ") @Table(name = "FAQ")
@Data @Data
@Where(clause = "is_deleted = false")
public class FaqEntity extends BaseEntity { public class FaqEntity extends BaseEntity {
@ManyToOne @ManyToOne
@@ -39,9 +40,6 @@ public class FaqEntity extends BaseEntity {
@Column(name = "RESPONSE_DATE") @Column(name = "RESPONSE_DATE")
private LocalDateTime responseDate; private LocalDateTime responseDate;
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
@Column(name ="COMPANY_ID") @Column(name ="COMPANY_ID")
private Long companyId; private Long companyId;

View File

@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.entities; package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -10,6 +11,7 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class FlowDataEntity extends BaseEntity{ public class FlowDataEntity extends BaseEntity{
@Column(name = "FORM_ID") @Column(name = "FORM_ID")
@@ -23,4 +25,5 @@ public class FlowDataEntity extends BaseEntity{
@Column(name="CALL_ID") @Column(name="CALL_ID")
private Long callId; private Long callId;
} }

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.*; import lombok.*;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -11,6 +12,7 @@ import java.time.LocalDateTime;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class FlowEdgesEntity extends BaseEntity { public class FlowEdgesEntity extends BaseEntity {
@Column(name = "SOURCE_ID") @Column(name = "SOURCE_ID")

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Builder; import lombok.Builder;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "FORM") @Table(name = "FORM")
@@ -12,6 +13,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class FormEntity extends BaseEntity{ public class FormEntity extends BaseEntity{
@Column(name = "LABEL", length = 255) @Column(name = "LABEL", length = 255)

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Builder; import lombok.Builder;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "FORM_FIELD") @Table(name = "FORM_FIELD")
@@ -12,6 +13,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class FormFieldEntity extends BaseEntity{ public class FormFieldEntity extends BaseEntity{
@Column(name = "NAME", length = 255) @Column(name = "NAME", length = 255)
@@ -31,4 +33,5 @@ public class FormFieldEntity extends BaseEntity{
@Column(name = "SORT_ORDER") @Column(name = "SORT_ORDER")
private Integer sortOrder; private Integer sortOrder;
} }

View File

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Builder; import lombok.Builder;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "FORM_TEMPLATE") @Table(name = "FORM_TEMPLATE")
@@ -12,6 +13,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
@Where(clause = "is_deleted = false")
public class FormTemplateEntity extends BaseEntity{ public class FormTemplateEntity extends BaseEntity{
@Column(name = "LABEL", length = 255) @Column(name = "LABEL", length = 255)

View File

@@ -15,7 +15,4 @@ public class GlobalConfigEntity extends BaseEntity{
@Column(name = "TYPE") @Column(name = "TYPE")
private String type; private String type;
@Column(name = "IS_DELETED")
private Boolean isDeleted = false;
} }

View File

@@ -4,12 +4,13 @@ import jakarta.persistence.*;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name="hub") @Table(name="hub")
@Setter @Setter
@Getter @Getter
@Where(clause = "is_deleted = false")
public class HubEntity extends BaseEntity{ public class HubEntity extends BaseEntity{
@Column(name = "COMPANY_NAME") @Column(name = "COMPANY_NAME")

View File

@@ -3,11 +3,13 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "hub_user") @Table(name = "hub_user")
@Getter @Getter
@Setter @Setter
@Where(clause = "is_deleted = false")
public class HubUserEntity extends BaseEntity{ public class HubUserEntity extends BaseEntity{
@ManyToOne @ManyToOne

View File

@@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Table(name = "LOGIN_ATTEMPT") @Table(name = "LOGIN_ATTEMPT")
@Data @Data
@Where(clause = "is_deleted = false")
public class LoginAttemptEntity extends BaseEntity{ public class LoginAttemptEntity extends BaseEntity{
@Column(name = "USERNAME") @Column(name = "USERNAME")

View File

@@ -3,10 +3,12 @@ package net.gepafin.tendermanagement.entities;
import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.annotation.JsonValue;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "LOOKUP_DATA") @Table(name = "LOOKUP_DATA")
@Data @Data
@Where(clause = "is_deleted = false")
public class LookUpDataEntity extends BaseEntity{ public class LookUpDataEntity extends BaseEntity{
@Column(name = "TITLE", columnDefinition = "TEXT", nullable = true) @Column(name = "TITLE", columnDefinition = "TEXT", nullable = true)

View File

@@ -0,0 +1,33 @@
package net.gepafin.tendermanagement.entities;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
import org.hibernate.annotations.Where;
@Entity
@Table(name = "NDGANAG")
@Data
@Where(clause = "is_deleted = false")
public class NdganagEntity extends BaseEntity{
@Column(name = "NDG")
private String ndg;
@Column(name = "COMPANY_NAME")
private String companyName;
@Column(name = "VAT_NUMBER")
private String vatNumber;
@Column(name = "CODICE_FISCALE")
private String codiceFiscale;
@Column(name = "JSON")
private String json;
@Column(name = "IS_DELETED")
private Boolean isDeleted;
}

View File

@@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "NOTIFICATION") @Table(name = "NOTIFICATION")
@Data @Data
@Where(clause = "is_deleted = false")
public class NotificationEntity extends BaseEntity { public class NotificationEntity extends BaseEntity {
@Column(name = "USER_ID") @Column(name = "USER_ID")
@@ -24,9 +26,6 @@ public class NotificationEntity extends BaseEntity {
@Column(name = "STATUS") @Column(name = "STATUS")
private String status; private String status;
@Column(name = "IS_DELETED")
private Boolean isDeleted;
@Column(name = "NOTIFICATION_TYPE") @Column(name = "NOTIFICATION_TYPE")
private String notificationType; private String notificationType;

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Data @Data
@Table(name = "NOTIFICATION_TYPE") @Table(name = "NOTIFICATION_TYPE")
@Where(clause = "is_deleted = false")
public class NotificationTypeEntity extends BaseEntity { public class NotificationTypeEntity extends BaseEntity {
@Column(name = "NOTIFICATION_NAME") @Column(name = "NOTIFICATION_NAME")
@@ -18,7 +20,4 @@ public class NotificationTypeEntity extends BaseEntity {
@Column(name = "TITLE") @Column(name = "TITLE")
private String title; private String title;
@Column(name="IS_DELETED")
private Boolean isDeleted;
} }

View File

@@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import net.gepafin.tendermanagement.config.LocalTimeAttributeConverter; import net.gepafin.tendermanagement.config.LocalTimeAttributeConverter;
import org.hibernate.annotations.Where;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
@@ -10,6 +11,7 @@ import java.time.LocalTime;
@Entity @Entity
@Table(name = "PROTOCOL") @Table(name = "PROTOCOL")
@Data @Data
@Where(clause = "is_deleted = false")
public class ProtocolEntity extends BaseEntity { public class ProtocolEntity extends BaseEntity {
@Column(name = "PROTOCOL_NUMBER", nullable = false) @Column(name = "PROTOCOL_NUMBER", nullable = false)

View File

@@ -6,6 +6,7 @@ import jakarta.persistence.Table;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.hibernate.annotations.Where;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -13,6 +14,7 @@ import java.math.BigDecimal;
@Table(name = "REGION") @Table(name = "REGION")
@Getter @Getter
@Setter @Setter
@Where(clause = "is_deleted = false")
public class RegionEntity extends BaseEntity { public class RegionEntity extends BaseEntity {
@Column(name = "REGION_NAME", length = 255, nullable = true) @Column(name = "REGION_NAME", length = 255, nullable = true)

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Data @Data
@Table(name ="role_action_context") @Table(name ="role_action_context")
@Where(clause = "is_deleted = false")
public class RoleActionContextEntity extends BaseEntity { public class RoleActionContextEntity extends BaseEntity {
@Column(name = "action_context") @Column(name = "action_context")
@@ -16,9 +18,6 @@ public class RoleActionContextEntity extends BaseEntity {
@Column(name = "role_id") @Column(name = "role_id")
private Long roleId; private Long roleId;
@Column(name="is_deleted")
private Boolean isDeleted;
@Column(name = "is_viewed") @Column(name = "is_viewed")
private Boolean isViewed; private Boolean isViewed;

View File

@@ -4,11 +4,13 @@ import jakarta.persistence.*;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "ROLE") @Table(name = "ROLE")
@Getter @Getter
@Setter @Setter
@Where(clause = "is_deleted = false")
public class RoleEntity extends BaseEntity { public class RoleEntity extends BaseEntity {
@Column(name = "ROLE_NAME", length = 255, nullable = true) @Column(name = "ROLE_NAME", length = 255, nullable = true)

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "s3_path_configuration") @Table(name = "s3_path_configuration")
@Data @Data
@Where(clause = "is_deleted = false")
public class S3ConfigEntity extends BaseEntity { public class S3ConfigEntity extends BaseEntity {
@Column(name = "TYPE") @Column(name = "TYPE")
@@ -21,5 +23,6 @@ public class S3ConfigEntity extends BaseEntity {
@Column(name = "PARENT_FOLDER") @Column(name = "PARENT_FOLDER")
private String parentFolder; private String parentFolder;
} }

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "SAML_RESPONSE") @Table(name = "SAML_RESPONSE")
@Data @Data
@Where(clause = "is_deleted = false")
public class SamlResponseEntity extends BaseEntity{ public class SamlResponseEntity extends BaseEntity{
@Column(name = "AUTHENTICATION_OBJECT") @Column(name = "AUTHENTICATION_OBJECT")
@@ -31,5 +33,4 @@ public class SamlResponseEntity extends BaseEntity{
@Column(name = "TOKEN") @Column(name = "TOKEN")
private String token; private String token;
} }

View File

@@ -8,10 +8,12 @@ import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "system_email_template") @Table(name = "system_email_template")
@Data @Data
@Where(clause = "is_deleted = false")
public class SystemEmailTemplatesEntity extends BaseEntity { public class SystemEmailTemplatesEntity extends BaseEntity {
@@ -33,9 +35,6 @@ public class SystemEmailTemplatesEntity extends BaseEntity {
@Column(name = "SYSTEM") @Column(name = "SYSTEM")
private Boolean system; private Boolean system;
@Column(name ="IS_DELETED", nullable = false)
private Boolean isDeleted = false;
@Column(name = "email_scenario") @Column(name = "email_scenario")
private String emailScenario; private String emailScenario;
@@ -56,7 +55,8 @@ public class SystemEmailTemplatesEntity extends BaseEntity {
USER_ONBOARDING_BANDI("USER_ONBOARDING_BANDI"), USER_ONBOARDING_BANDI("USER_ONBOARDING_BANDI"),
PASSWORD_RESET("PASSWORD_RESET"), PASSWORD_RESET("PASSWORD_RESET"),
INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"), INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"),
APPLICATION_SUBMISSION_FAILURE_NOTIFICATION("APPLICATION_SUBMISSION_FAILURE_NOTIFICATION"); APPLICATION_SUBMISSION_FAILURE_NOTIFICATION("APPLICATION_SUBMISSION_FAILURE_NOTIFICATION"),
INADMISSIBILITY_NOTIFICATION_DUE_TO_TECHNICAL_EVALUATION_FAILURE("INADMISSIBILITY_NOTIFICATION_DUE_TO_TECHNICAL_EVALUATION_FAILURE");
private String value; private String value;
SystemEmailTemplatesEntityTypeEnum(String value) { SystemEmailTemplatesEntityTypeEnum(String value) {

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Data @Data
@Entity @Entity
@Table(name = "user_action") @Table(name = "user_action")
@Where(clause = "is_deleted = false")
public class UserActionEntity extends BaseEntity { public class UserActionEntity extends BaseEntity {
@Column(name = "USER_ID") @Column(name = "USER_ID")
@@ -40,7 +42,4 @@ public class UserActionEntity extends BaseEntity {
@Column(name = "RESPONSE") @Column(name = "RESPONSE")
private String response; private String response;
@Column(name = "IS_DELETED", nullable = false)
private Boolean isDeleted = false;
} }

View File

@@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Data @Data
@Entity @Entity
@Table(name = "user_company_delegation") @Table(name = "user_company_delegation")
@Where(clause = "is_deleted = false")
public class UserCompanyDelegationEntity extends BaseEntity{ public class UserCompanyDelegationEntity extends BaseEntity{
@Column(name="USER_ID") @Column(name="USER_ID")

View File

@@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.hibernate.annotations.Where;
import net.gepafin.tendermanagement.model.response.EmailSendResponse; import net.gepafin.tendermanagement.model.response.EmailSendResponse;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -16,6 +17,7 @@ import java.util.List;
@Table(name = "GEPAFIN_USER") @Table(name = "GEPAFIN_USER")
@Getter @Getter
@Setter @Setter
@Where(clause = "is_deleted = false")
public class UserEntity extends BaseEntity { public class UserEntity extends BaseEntity {
@Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true) @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true)

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Entity @Entity
@Table(name = "USER_WITH_COMPANY") @Table(name = "USER_WITH_COMPANY")
@Data @Data
@Where(clause = "is_deleted = false")
public class UserWithCompanyEntity extends BaseEntity{ public class UserWithCompanyEntity extends BaseEntity{
@Column(name = "USER_ID") @Column(name = "USER_ID")
@@ -35,7 +37,4 @@ public class UserWithCompanyEntity extends BaseEntity{
@Column(name = "EMAIL") @Column(name = "EMAIL")
private String email; private String email;
@Column(name = "IS_DELETED")
private Boolean isDeleted = false;
} }

View File

@@ -4,10 +4,12 @@ import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Where;
@Data @Data
@Entity @Entity
@Table(name = "version_history") @Table(name = "version_history")
@Where(clause = "is_deleted = false")
public class VersionHistoryEntity extends BaseEntity { public class VersionHistoryEntity extends BaseEntity {
@Column(name = "OLD_DATA", columnDefinition = "LONGTEXT") @Column(name = "OLD_DATA", columnDefinition = "LONGTEXT")
@@ -30,7 +32,4 @@ public class VersionHistoryEntity extends BaseEntity {
@Column(name = "USER_ID") @Column(name = "USER_ID")
private Long userId; private Long userId;
@Column(name = "IS_DELETED", nullable = false)
private Boolean isDeleted = false;
} }

View File

@@ -6,7 +6,8 @@ public enum ApplicationStatusForEvaluation {
APPROVED("APPROVED"), APPROVED("APPROVED"),
REJECTED("REJECTED"), REJECTED("REJECTED"),
ADMISSIBLE("ADMISSIBLE"), ADMISSIBLE("ADMISSIBLE"),
TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"),
TECHNICAL_EVALUATION_REJECTED("TECHNICAL_EVALUATION_REJECTED");
private String value; private String value;

View File

@@ -16,7 +16,8 @@ public enum ApplicationStatusTypeEnum {
APPOINTMENT("APPOINTMENT"), APPOINTMENT("APPOINTMENT"),
NDG("NDG"), NDG("NDG"),
ADMISSIBLE("ADMISSIBLE"), ADMISSIBLE("ADMISSIBLE"),
TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"),
TECHNICAL_EVALUATION_REJECTED("TECHNICAL_EVALUATION_REJECTED");
private String value; private String value;

View File

@@ -12,7 +12,8 @@ public enum EmailScenarioTypeEnum {
USER_CREATION("USER_CREATION"), USER_CREATION("USER_CREATION"),
PASSWORD_RESET_REQUEST("PASSWORD_RESET_REQUEST"), PASSWORD_RESET_REQUEST("PASSWORD_RESET_REQUEST"),
APPLICATION_REJECTED("APPLICATION_REJECTED"), APPLICATION_REJECTED("APPLICATION_REJECTED"),
APPLICATION_SUBMISSION_FAILURE("APPLICATION_SUBMISSION_FAILURE"); APPLICATION_SUBMISSION_FAILURE("APPLICATION_SUBMISSION_FAILURE"),
APPLICATION_TECHNICAL_EVALUATION_REJECTED("APPLICATION_TECHNICAL_EVALUATION_REJECTED");
private final String value; private final String value;

View File

@@ -0,0 +1,18 @@
package net.gepafin.tendermanagement.enums;
import com.fasterxml.jackson.annotation.JsonValue;
public enum HttpMethodEnum {
POST("POST"), PUT("PUT"), GET("GET"), DELETE("DELETE");
private String value;
HttpMethodEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,22 @@
package net.gepafin.tendermanagement.enums;
import com.fasterxml.jackson.annotation.JsonValue;
public enum NdgStatusEnum {
NDG_INITITATED("NDG_INITITATED"),
NDG_GENERATED("NDG_GENERATED"),
NDG_IN_PROGRESS("NDG_IN_PROGRESS");
private String value;
NdgStatusEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}

View File

@@ -47,6 +47,8 @@ public enum UserActionContextEnum {
GET_NEXT_PREVIOUS_FORM("GET_NEXT_PREVIOUS_FORM"), GET_NEXT_PREVIOUS_FORM("GET_NEXT_PREVIOUS_FORM"),
DOWNLOAD_APPLICATION_DOC_ZIP("DOWNLOAD_APPLICATION_DOC_ZIP"), DOWNLOAD_APPLICATION_DOC_ZIP("DOWNLOAD_APPLICATION_DOC_ZIP"),
READMIT_APPLICATION("READMIT_APPLICATION"), READMIT_APPLICATION("READMIT_APPLICATION"),
DOWNLOAD_CSV_BY_CALL_ID("DOWNLOAD_CSV_BY_CALL_ID"),
DOWNLOAD_CSV_AS_PER_RANKING("DOWNLOAD_CSV_AS_PER_RANKING"),
/** FAQ action context **/ /** FAQ action context **/
CREATE_FAQ("CREATE_FAQ"), CREATE_FAQ("CREATE_FAQ"),
@@ -67,6 +69,7 @@ public enum UserActionContextEnum {
GET_COMPANY_BY_USER("GET_COMPANY_BY_USER"), GET_COMPANY_BY_USER("GET_COMPANY_BY_USER"),
REMOVE_COMPANY_FROM_USER("REMOVE_COMPANY_FROM_USER"), REMOVE_COMPANY_FROM_USER("REMOVE_COMPANY_FROM_USER"),
UPDATE_COMPANY_JSON("UPDATE_COMPANY_JSON"), UPDATE_COMPANY_JSON("UPDATE_COMPANY_JSON"),
EXTRACT_PEC_FROM_COMPANY("EXTRACT_PEC_FROM_COMPANY"),
/** LookUpData action context **/ /** LookUpData action context **/
CREATE_LOOKUP_DATA("CREATE_LOOKUP_DATA"), CREATE_LOOKUP_DATA("CREATE_LOOKUP_DATA"),
@@ -180,6 +183,7 @@ public enum UserActionContextEnum {
CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"),
CREATE_APPOINTMENT("CREATE_APPOINTMENT"), CREATE_APPOINTMENT("CREATE_APPOINTMENT"),
UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"),
GET_NDG_BY_VAT_NUMBER("GET_NDG_BY_VAT_NUMBER"),
GET_ALL_NOTIFICATION_BY_PAGINATION("GET_ALL_NOTIFICATION_BY_PAGINATION"), GET_ALL_NOTIFICATION_BY_PAGINATION("GET_ALL_NOTIFICATION_BY_PAGINATION"),
GET_ALL_CALL_BY_PAGINATION("GET_ALL_CALL_BY_PAGINATION"), GET_ALL_CALL_BY_PAGINATION("GET_ALL_CALL_BY_PAGINATION"),

View File

@@ -44,6 +44,8 @@ public class CreateCallRequestStep1 {
private Boolean confidi; private Boolean confidi;
private Boolean allowMultipleApplications;
private List<FaqReq> faq; private List<FaqReq> faq;
private EvaluationVersionEnum evaluationVersion; private EvaluationVersionEnum evaluationVersion;

View File

@@ -38,6 +38,8 @@ public class UpdateCallRequestStep1 {
private Boolean confidi; private Boolean confidi;
private Boolean allowMultipleApplications;
private List<FaqReq> faq; private List<FaqReq> faq;
private Long numberOfCheck; private Long numberOfCheck;

View File

@@ -21,6 +21,7 @@ public class AssignedApplicationViewResponse extends BaseBean {
private Long protocolNumber; private Long protocolNumber;
private String callName; private String callName;
private String companyName; private String companyName;
private String assignedUserName;
private List<EmailSendResponse> emailSendResponse; private List<EmailSendResponse> emailSendResponse;

View File

@@ -23,6 +23,8 @@ public class CallDetailsResponseBean {
private Boolean confidi; private Boolean confidi;
private Boolean allowMultipleApplications;
private CallStatusEnum status; private CallStatusEnum status;
private Long regionId; private Long regionId;

View File

@@ -44,6 +44,8 @@ public class CallResponse {
private Boolean confidi; private Boolean confidi;
private Boolean allowMultipleApplications;
private BigDecimal amountMin; private BigDecimal amountMin;
private String email; private String email;

View File

@@ -181,4 +181,7 @@ public interface ApplicationRepository extends JpaRepository<ApplicationEntity,
ApplicationEntity findByIdAndStatusAndIsDeletedFalse( Long id, String status); ApplicationEntity findByIdAndStatusAndIsDeletedFalse( Long id, String status);
public List<ApplicationEntity> findByCallIdAndIsDeletedFalseAndStatusIn(Long callId,List<String> status);
} }

View File

@@ -31,5 +31,7 @@ public interface CompanyRepository extends JpaRepository<CompanyEntity, Long> {
""") """)
Page<CompanyEntity> findCompaniesWithMissingVatCheck(Pageable pageable); Page<CompanyEntity> findCompaniesWithMissingVatCheck(Pageable pageable);
List<CompanyEntity> findByJsonIsNotNullAndPecIsNull();
} }

View File

@@ -18,4 +18,6 @@ public interface EvaluationCriteriaRepository extends JpaRepository<EvaluationCr
List<EvaluationCriteriaEntity> findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type); List<EvaluationCriteriaEntity> findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type);
// List<EvaluationCriteriaEntity> findByCallId(Long callId); // List<EvaluationCriteriaEntity> findByCallId(Long callId);
List<EvaluationCriteriaEntity> findByCallIdAndIsDeletedFalse(Long callId);
} }

View File

@@ -0,0 +1,14 @@
package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.NdganagEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface NdganagRepository extends JpaRepository<NdganagEntity,Long> {
NdganagEntity findByVatNumber(String vatNumber);
}

View File

@@ -91,7 +91,11 @@ public class ApplicationEvaluationScheduler {
// Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); // Map<String, String> placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED);
Map<String, String> placeHolders = new HashMap<>(); Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName()); placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); String protocolNumber=application.getProtocol().getExternalProtocolNumber();
if(protocolNumber==null){
protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber());
}
placeHolders.put("{{protocol_number}}", protocolNumber);
notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED);
notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED);
notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED);

View File

@@ -52,4 +52,7 @@ public interface ApplicationService {
public ApplicationResponse readmitApplication(HttpServletRequest request, Long applicationId); public ApplicationResponse readmitApplication(HttpServletRequest request, Long applicationId);
public byte[] downloadRankingCsv(HttpServletRequest request, Long callId);
} }

View File

@@ -13,4 +13,7 @@ public interface AppointmentService {
AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest); AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest);
DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest); DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest);
NdgResponse getNdgByVatNumber(HttpServletRequest request,String vatNumber);
} }

View File

@@ -47,4 +47,5 @@ public interface CompanyService {
void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest); void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest);
void extractPecFromJson(HttpServletRequest request);
} }

View File

@@ -176,4 +176,10 @@ public class ApplicationServiceImpl implements ApplicationService {
UserEntity userEntity = validator.validateUser(request); UserEntity userEntity = validator.validateUser(request);
return applicationDao.readmitApplication(request, applicationId); return applicationDao.readmitApplication(request, applicationId);
} }
@Override
public byte[] downloadRankingCsv(HttpServletRequest request, Long callId) {
UserEntity userEntity = validator.validateUser(request);
return applicationDao.downloadRankingCsv(callId,userEntity);
}
} }

View File

@@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.service.impl;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.dao.AppointmentDao; import net.gepafin.tendermanagement.dao.AppointmentDao;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest;
import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest;
import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse;
import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; import net.gepafin.tendermanagement.model.response.DocumentUploadResponse;
import net.gepafin.tendermanagement.model.response.NdgResponse; import net.gepafin.tendermanagement.model.response.NdgResponse;
import net.gepafin.tendermanagement.service.AppointmentService; import net.gepafin.tendermanagement.service.AppointmentService;
import net.gepafin.tendermanagement.util.Validator;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -17,6 +19,9 @@ public class AppointmentServiceImpl implements AppointmentService {
@Autowired @Autowired
private AppointmentDao appointmentDao; private AppointmentDao appointmentDao;
@Autowired
private Validator validator;
@Override @Override
public NdgResponse checkNdgForAppointment(HttpServletRequest request, Long applicationId) { public NdgResponse checkNdgForAppointment(HttpServletRequest request, Long applicationId) {
@@ -34,4 +39,11 @@ public class AppointmentServiceImpl implements AppointmentService {
return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest); return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest);
} }
@Override
public NdgResponse getNdgByVatNumber(HttpServletRequest request,String vatNumber) {
UserEntity userEntity = validator.validateUser(request);
NdgResponse ndgResponse= appointmentDao.getNdgByVatNumber(vatNumber,userEntity);
return ndgResponse;
}
} }

View File

@@ -142,4 +142,10 @@ public class CompanyServiceImpl implements CompanyService {
UserEntity userEntity =validator.validateUser(request); UserEntity userEntity =validator.validateUser(request);
companyDao.updateMissingVatCheckResponses(request,limitRequest); companyDao.updateMissingVatCheckResponses(request,limitRequest);
} }
@Override
public void extractPecFromJson(HttpServletRequest request) {
UserEntity userEntity =validator.validateUser(request);
companyDao.getCompanyEntity();
}
} }

View File

@@ -6,9 +6,7 @@ import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.NumberFormat; import java.text.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
@@ -1052,5 +1050,48 @@ public class Utils {
headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"); headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0");
return headers; return headers;
} }
public static void setHttpServletRequestForThread(HttpServletRequest request,String methodType, String remoteUser, Long userActionId) {
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.setRequestURI(request.getRequestURI());
mockRequest.setMethod(methodType);
mockRequest.setRemoteUser(remoteUser); // or pass it in if needed
mockRequest.setAttribute(GepafinConstant.USER_ACTION_ID, userActionId);
ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest);
RequestContextHolder.setRequestAttributes(attributes, true);
}
public static String convertToItalianFormatWithOnlyDecimalValue(String amount) {
try {
// Step 1: Sanitize and standardize the input
String sanitizedAmount = amount.trim();
// Remove thousand separators (either . or , depending on input style)
sanitizedAmount = sanitizedAmount.replace(",", "").replace(" ", "");
// Step 2: Ensure it uses '.' as decimal separator for parsing
if (sanitizedAmount.contains(".")) {
// It already uses dot as decimal separator
} else if (sanitizedAmount.contains(",")) {
// If input uses comma as decimal separator (like "1234,56")
sanitizedAmount = sanitizedAmount.replace(",", ".");
}
// Step 3: Parse to double
double parsedAmount = Double.parseDouble(sanitizedAmount);
// Step 4: Format without thousand separator and with comma as decimal
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
DecimalFormat italianDecimalFormat = new DecimalFormat("0.00", symbols);
italianDecimalFormat.setGroupingUsed(false); // no thousand separator
return italianDecimalFormat.format(parsedAmount);
} catch (NumberFormatException e) {
return "Invalid amount format";
}
}
} }

View File

@@ -252,6 +252,21 @@ public interface ApplicationApi {
ResponseEntity<Response<ApplicationResponse>> readmitApplication(HttpServletRequest request, ResponseEntity<Response<ApplicationResponse>> readmitApplication(HttpServletRequest request,
@Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId);
@Operation(summary = "Api to download application data as a CSV file as per ranking",
responses = {
@ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))
})
@GetMapping(value = "/call/{callId}/ranking-csv")
@PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')")
public ResponseEntity<byte[]> downloadRankingCsv(
HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable(value = "callId", required = true) Long callId);
} }

View File

@@ -56,4 +56,15 @@ public interface AppointmentApi {
ResponseEntity<Response<DocumentUploadResponse>> uploadDocumentToExternalSystem(HttpServletRequest request, ResponseEntity<Response<DocumentUploadResponse>> uploadDocumentToExternalSystem(HttpServletRequest request,
@Parameter(description = "The document id", required = true) @PathVariable(value = "documentId", required = true) Long documentId, @Parameter(description = "The document id", required = true) @PathVariable(value = "documentId", required = true) Long documentId,
@RequestBody UploadDocToExternalSystemRequest docToExternalSystemRequest); @RequestBody UploadDocToExternalSystemRequest docToExternalSystemRequest);
@Operation(summary = "API to get ndg by vatNumber", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@GetMapping(value = "/vatNumber/{vatNumber}", produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<Response<NdgResponse>> getNdgByVatNumber(HttpServletRequest request,@PathVariable(value = "vatNumber", required = true) @Parameter(description = "vatNumber",required = true)String vatNumber);
} }

View File

@@ -169,4 +169,17 @@ public interface CompanyApi {
@PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ") @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ")
ResponseEntity<Response<Void>> updateMissingVatCheckResponses(HttpServletRequest request, ResponseEntity<Response<Void>> updateMissingVatCheckResponses(HttpServletRequest request,
@Parameter(description = "Limit request object ", required = true) @RequestBody LimitRequest limitRequest); @Parameter(description = "Limit request object ", required = true) @RequestBody LimitRequest limitRequest);
@Operation(summary = "Api to extract pec from the company json", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@GetMapping(value = "/pec", produces = { "application/json" })
@PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ")
ResponseEntity<Response<Void>> extractPecFromJson(HttpServletRequest request);
} }

View File

@@ -27,6 +27,8 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.slf4j.Logger; import org.slf4j.Logger;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@@ -236,6 +238,10 @@ public class ApplicationApiController implements ApplicationApi {
} }
@Override @Override
public ResponseEntity<byte[]> exportCsv(HttpServletRequest request, Long callId) { public ResponseEntity<byte[]> exportCsv(HttpServletRequest request, Long callId) {
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD).actionContext(UserActionContextEnum.DOWNLOAD_CSV_BY_CALL_ID).build());
byte[] csvBytes =applicationService.exportCsv(request,callId); byte[] csvBytes =applicationService.exportCsv(request,callId);
return ResponseEntity.ok() return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=applications.csv") .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=applications.csv")
@@ -254,4 +260,19 @@ public class ApplicationApiController implements ApplicationApi {
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.READMIT_APPLICATION_SUCCESS))); .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.READMIT_APPLICATION_SUCCESS)));
} }
@Override
public ResponseEntity<byte[]> downloadRankingCsv(HttpServletRequest request, Long callId) {
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD).actionContext(UserActionContextEnum.DOWNLOAD_CSV_AS_PER_RANKING).build());
byte[] csvBytes =applicationService.downloadRankingCsv(request,callId);
String dateString = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String fileName = "call_" + callId + "_" + dateString + ".csv";
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(csvBytes);
}
} }

View File

@@ -46,7 +46,7 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation
request, evaluationRequest, assignedApplicationsId); request, evaluationRequest, assignedApplicationsId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_REQUEST_COMPLETED)));
} }

View File

@@ -17,6 +17,7 @@ import net.gepafin.tendermanagement.service.AppointmentService;
import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.AppointmentApi; import net.gepafin.tendermanagement.web.rest.api.AppointmentApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.opensaml.xmlsec.signature.G;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -81,4 +82,19 @@ public class AppointmentController implements AppointmentApi {
.body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(message))); .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(message)));
} }
@Override
public ResponseEntity<Response<NdgResponse>> getNdgByVatNumber(HttpServletRequest request,String vatNumber) {
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.GET_NDG_BY_VAT_NUMBER).build());
NdgResponse ndgResponse= appointmentService.getNdgByVatNumber(request,vatNumber);
if(ndgResponse==null){
return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(ndgResponse, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.NDG_NOT_FOUND)));
}
return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(ndgResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_FETCH_SUCCESSFULLY)));
}
} }

View File

@@ -201,4 +201,17 @@ public class CompanyApiController implements CompanyApi{
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG)));
} }
@Override
public ResponseEntity<Response<Void>> extractPecFromJson(HttpServletRequest request) {
log.info("Api to set pec from json field");
companyService.extractPecFromJson(request);
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.EXTRACT_PEC_FROM_COMPANY).build());
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG)));
}
} }

View File

@@ -37,3 +37,5 @@ spring.rabbitmq.port=61613
spring.rabbitmq.username=guest spring.rabbitmq.username=guest
spring.rabbitmq.password=guest spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/ spring.rabbitmq.virtual-host=/
isSviluppumbriaProtocolEnabled = false

View File

@@ -91,3 +91,4 @@ codiceUo=101_10
competente=true competente=true
tipoCorrispondente=Amministrazione tipoCorrispondente=Amministrazione
sviluppumbriaUuid=t7jh5wfg9QXylNaTZkPoE sviluppumbriaUuid=t7jh5wfg9QXylNaTZkPoE
isSviluppumbriaProtocolEnabled = true

View File

@@ -2737,6 +2737,132 @@
</insert> </insert>
</changeSet> </changeSet>
<changeSet id="09-01-2025_PK_120129" author="Piyush Kag">
<addColumn tableName="application_signed_document">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="APPLICATION_FORM">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="APPLICATION_FORM_FIELD">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="BENEFICIARY">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="CALL">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="COMPANY">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="FLOW_DATA">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="FLOW_EDGES">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="FORM">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="FORM_FIELD">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="FORM_TEMPLATE">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="hub">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="LOGIN_ATTEMPT">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="LOOKUP_DATA">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="PROTOCOL">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="REGION">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="ROLE">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="s3_path_configuration">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="SAML_RESPONSE">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="user_company_delegation">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
<addColumn tableName="GEPAFIN_USER">
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
<changeSet id="08-04-2025_PK_160730" author="Piyush kag"> <changeSet id="08-04-2025_PK_160730" author="Piyush kag">
<sqlFile dbms="postgresql" <sqlFile dbms="postgresql"
@@ -2836,4 +2962,57 @@
</addColumn> </addColumn>
</changeSet> </changeSet>
<changeSet id="05-06-2025_RK_191738" author="Rajesh Khore">
<sqlFile dbms="postgresql"
path="db/dump/updated_form_field_05_06_2025.sql"/>
</changeSet>
<changeSet id="06-06-2025_RK_180524" author="Rajesh Khore">
<createTable tableName="ndganag">
<column name="id" type="INTEGER" autoIncrement="true">
<constraints primaryKey="true" primaryKeyName="ndganag_pkey" nullable="false"/>
</column>
<column name="ndg" type="VARCHAR(255)" />
<column name="company_name" type="VARCHAR(255)"/>
<column name="vat_number" type="VARCHAR(255)" />
<column name="codice_fiscale" type="VARCHAR(255)" />
<column name="json" type="TEXT"/>
<column name="is_deleted" type="BOOLEAN"/>
<column name="created_date" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="updated_date" type="TIMESTAMP WITHOUT TIME ZONE"/>
</createTable>
<addColumn tableName="application">
<column name="pec_email" type="VARCHAR(255)"></column>
</addColumn>
</changeSet>
<changeSet id="27-06-2025_RK_155914" author="Rajesh Khore">
<sqlFile dbms="postgresql"
path="db/dump/insert_system_email_template_technical_evaluation_rejected.sql"/>
</changeSet>
<changeSet id="02-07_2025_RK_162833" author="Rajesh Khore">
<addColumn tableName="application">
<column name="vat_number" type="VARCHAR(255)"></column>
</addColumn>
</changeSet>
<changeSet id="02-07-2025_RK_152053" author="Rajesh Khore">
<addColumn tableName="call">
<column name="allow_multiple_applications" type="BOOLEAN" defaultValueBoolean="false"></column>
</addColumn>
</changeSet>
<changeSet id="08-07-2025_RK_152945" author="Rajesh Khore">
<sqlFile dbms="postgresql"
path="db/dump/update_assigned_application_view_08_07_2025.sql"/>
<sqlFile dbms="postgresql"
path="db/dump/update_application_form_view_08_07_2025.sql"/>
</changeSet>
<changeSet id="23-07-2025_RK_121816" author="Rajesh Khore">
<sqlFile dbms="postgresql" path="db/dump/update_application_form_view_23_07_2025.sql"/>
</changeSet>
</databaseChangeLog> </databaseChangeLog>

View File

@@ -0,0 +1,31 @@
INSERT INTO gepafin_schema.system_email_template
(template_name, "type", html_content, subject, "json", "system", is_deleted, created_date, updated_date, email_scenario)
VALUES
(
'Application Technical Evaluation Rejected Template',
'INADMISSIBILITY_NOTIFICATION_DUE_TO_TECHNICAL_EVALUATION_FAILURE',
'<html>
<body style="font-family: Arial, sans-serif; color: #000; line-height: 1.6;">
<div style="padding: 20px; border: 1px solid #ddd; border-radius: 8px; max-width: 600px; margin: auto;">
<p>Buongiorno,</p>
<p>Si comunica che, in riferimento alla domanda a valere sul bando “<strong>{{call_name}}</strong>” di cui al
<strong>Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}</strong>,
a stessa è stata sottoposta a valutazione tecnica ed economico finanziaria
con esito negativo</p>
<p>Le motivazioni sono le seguenti: <strong>{{form_text}}</strong></p>
<p>Vi ricordiamo che i Beneficiari, in caso di mancato accoglimento della Domanda di Finanziamento agevolato, entro 10 giorni dalla data di ricevimento della presente potranno formulare ricorso al Gestore tramite
modello disponibile nello sportello online
<a href="{{platform_link}}">{{platform_link}}</a>, e sul sito internet home - ND Credit Repair , nella sezione dedicata ai Bandi e Avvisi pubblici.</p>
<p>Distinti Saluti,</p>
<p><strong>{{email_signature}}</strong></p>
</div>
</body>
</html>',
'BANDO "{{call_name}}" Esito negativo della valutazione tecnica {{company_name}}',
null,
true,
false,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,
'APPLICATION_TECHNICAL_EVALUATION_REJECTED'
);

Some files were not shown because too many files have changed in this diff Show More