Resolved conflicts

This commit is contained in:
rajesh
2025-08-01 13:37:35 +05:30
42 changed files with 952 additions and 120 deletions

View File

@@ -575,6 +575,8 @@ public class GepafinConstant {
public static final String NDG_NOT_FOUND="ndg.not.found"; 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 EMAIL_PEC_REQUIRED="email.pec.cannot.null";
public static final String COMPANY_NAME_JSON="denominazione"; public static final String COMPANY_NAME_JSON="denominazione";
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
@@ -1152,6 +1152,8 @@ public class ApplicationAmendmentRequestDao {
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);
Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L; Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L;
applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays); applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays);
applicationAmendmentRequestEntity.setExtendedDays(newResponseDays);
applicationAmendmentRequestEntity.setExtensionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(newResponseDays))); applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(newResponseDays)));
applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue()); applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue());
applicationAmendmentRequestEntity.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); applicationAmendmentRequestEntity.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
@@ -1640,53 +1642,53 @@ public class ApplicationAmendmentRequestDao {
return updated; return updated;
} }
public long calculateSuspendedDays(List<ApplicationAmendmentRequestEntity> amendments) { // public long calculateSuspendedDays(List<ApplicationAmendmentRequestEntity> amendments) {
List<Pair<LocalDateTime, LocalDateTime>> periods = amendments.stream() // List<Pair<LocalDateTime, LocalDateTime>> periods = amendments.stream()
.filter(amendmentRequest -> amendmentRequest.getStartDate() != null) // .filter(amendmentRequest -> amendmentRequest.getStartDate() != null)
.map(amendmentRequest -> { // .map(amendmentRequest -> {
LocalDateTime start = amendmentRequest.getStartDate(); // LocalDateTime start = amendmentRequest.getStartDate();
LocalDateTime end; // LocalDateTime end;
//
String status = amendmentRequest.getStatus(); // String status = amendmentRequest.getStatus();
if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.CLOSE.getValue().equals(status)) && amendmentRequest.getClosingDate() != null) { // if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.CLOSE.getValue().equals(status)) && amendmentRequest.getClosingDate() != null) {
end = amendmentRequest.getClosingDate(); // end = amendmentRequest.getClosingDate();
} else if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue().equals(status)) && amendmentRequest.getEndDate() != null) { // } else if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue().equals(status)) && amendmentRequest.getEndDate() != null) {
end = amendmentRequest.getStartDate().plusDays(amendmentRequest.getResponseDays()); // end = amendmentRequest.getStartDate().plusDays(amendmentRequest.getResponseDays());
}else { // }else {
end= amendmentRequest.getEndDate(); // end= amendmentRequest.getEndDate();
} // }
//
return Pair.of(start, end); // return Pair.of(start, end);
}) // })
.filter(Objects::nonNull) // .filter(Objects::nonNull)
.sorted(Comparator.comparing(Pair::getLeft)) // .sorted(Comparator.comparing(Pair::getLeft))
.collect(Collectors.toList()); // .collect(Collectors.toList());
//
long totalDays = 0; // long totalDays = 0;
LocalDateTime currentStart = null; // LocalDateTime currentStart = null;
LocalDateTime currentEnd = null; // LocalDateTime currentEnd = null;
//
for (Pair<LocalDateTime, LocalDateTime> period : periods) { // for (Pair<LocalDateTime, LocalDateTime> period : periods) {
if (currentStart == null) { // if (currentStart == null) {
currentStart = period.getLeft(); // currentStart = period.getLeft();
currentEnd = period.getRight(); // currentEnd = period.getRight();
} else if (!period.getLeft().isAfter(currentEnd)) { // } else if (!period.getLeft().isAfter(currentEnd)) {
// Merge overlapping/touching periods // // Merge overlapping/touching periods
currentEnd = currentEnd.isAfter(period.getRight()) ? currentEnd : period.getRight(); // currentEnd = currentEnd.isAfter(period.getRight()) ? currentEnd : period.getRight();
} else { // } else {
// Non-overlapping: count previous period // // Non-overlapping: count previous period
totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate()); // totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate());
currentStart = period.getLeft(); // currentStart = period.getLeft();
currentEnd = period.getRight(); // currentEnd = period.getRight();
} // }
} // }
//
if (currentStart != null && currentEnd != null) { // if (currentStart != null && currentEnd != null) {
totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate()); // totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate());
} // }
//
return totalDays; // return totalDays;
} // }
@@ -1712,4 +1714,65 @@ public class ApplicationAmendmentRequestDao {
} }
return applicationAmendmentRequestEntity; return applicationAmendmentRequestEntity;
} }
public long calculateSuspendedDays(List<ApplicationAmendmentRequestEntity> amendments) {
List<Pair<LocalDateTime, LocalDateTime>> periods = amendments.stream()
.filter(amendmentRequest -> amendmentRequest.getStartDate() != null)
.flatMap(amendmentRequest -> {
List<Pair<LocalDateTime, LocalDateTime>> result = new ArrayList<>();
LocalDateTime start = amendmentRequest.getStartDate();
String status = amendmentRequest.getStatus();
Long responseDays = amendmentRequest.getResponseDays() != null ? amendmentRequest.getResponseDays() : 0L;
LocalDateTime extensionDate = amendmentRequest.getExtensionDate();
Long extendedDays = amendmentRequest.getExtendedDays() != null ? amendmentRequest.getExtendedDays() : 0L;
if (ApplicationAmendmentRequestEnum.CLOSE.getValue().equals(status) && amendmentRequest.getClosingDate() != null) {
if (extensionDate != null && amendmentRequest.getClosingDate().isAfter(extensionDate)) {
long overlappingExtensionDays = ChronoUnit.DAYS.between(extensionDate.toLocalDate(), amendmentRequest.getClosingDate().toLocalDate());
long adjustedInitialPeriod = responseDays - overlappingExtensionDays;
result.add(Pair.of(start, start.plusDays(adjustedInitialPeriod)));
} else {
result.add(Pair.of(start, amendmentRequest.getClosingDate()));
}
} else if (ApplicationAmendmentRequestEnum.EXPIRED.getValue().equals(status)) {
result.add(Pair.of(start, start.plusDays(responseDays)));
} else {
if (amendmentRequest.getEndDate() != null) {
result.add(Pair.of(start, amendmentRequest.getEndDate()));
} else {
result.add(Pair.of(start, start.plusDays(responseDays)));
}
}
return result.stream();
})
.filter(Objects::nonNull)
.sorted(Comparator.comparing(Pair::getLeft))
.collect(Collectors.toList());
long totalDays = 0;
LocalDateTime currentStart = null;
LocalDateTime currentEnd = null;
for (Pair<LocalDateTime, LocalDateTime> period : periods) {
if (currentStart == null) {
currentStart = period.getLeft();
currentEnd = period.getRight();
} else if (!period.getLeft().isAfter(currentEnd)) {
currentEnd = currentEnd.isAfter(period.getRight()) ? currentEnd : period.getRight();
} else {
totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate());
currentStart = period.getLeft();
currentEnd = period.getRight();
}
}
if (currentStart != null && currentEnd != null) {
totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate());
}
return totalDays;
}
} }

View File

@@ -56,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;
@@ -217,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) {
@@ -593,11 +598,9 @@ public class ApplicationDao {
String fieldType = content.getName(); String fieldType = content.getName();
// Define handlers for different (fieldType + settingName) combinations // Define handlers for different (fieldType + settingName) combinations
Map<String, Runnable> handlers = new HashMap<>();
// Add handler for isRequestedAmount // Add handler for isRequestedAmount
if ("numberinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isRequestedAmount"))) { if ("numberinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isRequestedAmount"))) {
handlers.put("isRequestedAmount", () -> {
try { try {
BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); BigDecimal amountRequested = new BigDecimal(fieldValue.toString());
applicationFormEntity.getApplication().setAmountRequested(amountRequested); applicationFormEntity.getApplication().setAmountRequested(amountRequested);
@@ -606,19 +609,20 @@ public class ApplicationDao {
log.error("Invalid number format for requested amount: {}", fieldValue, e); log.error("Invalid number format for requested amount: {}", fieldValue, e);
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 // Add handler for isPecEmail
if ("textinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isPecEmail"))) { if ("textinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isPecEmail"))) {
handlers.put("isPecEmail", () -> {
applicationFormEntity.getApplication().setPecEmail(fieldValue.toString()); applicationFormEntity.getApplication().setPecEmail(fieldValue.toString());
log.info("Set PEC to {} for Application ID: {}", fieldValue, applicationFormEntity.getApplication().getId()); 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 // Run all applicable handlers
handlers.values().forEach(Runnable::run);
}); });
@@ -641,7 +645,6 @@ public class ApplicationDao {
} }
} }
} }
calculationProcessForFormula(applicationFormEntity,contentResponseBeans,applicationFormFieldRequestBean,fieldValidator);
Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId());
if (applicationFormFieldRequestBean.getFieldValue() != null) { if (applicationFormFieldRequestBean.getFieldValue() != null) {
@@ -988,9 +991,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);
@@ -1059,9 +1064,9 @@ public class ApplicationDao {
ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true);
protocolDao.saveProtocolEntity(protocolEntity); protocolDao.saveProtocolEntity(protocolEntity);
applicationEntity.setProtocol(protocolEntity); applicationEntity.setProtocol(protocolEntity);
if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(sviluppumbriaUuid))) { // if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(sviluppumbriaUuid))) {
protocolEntity = protocolDao.createExternalProtocol(applicationEntity, company, protocolEntity); // protocolEntity = protocolDao.createExternalProtocol(applicationEntity, company, protocolEntity);
} // }
applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue());
applicationEntity.setSubmissionDate(protocolEntity.getCreatedDate()); applicationEntity.setSubmissionDate(protocolEntity.getCreatedDate());
applicationEntity = applicationRepository.save(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
@@ -1665,12 +1670,12 @@ public class ApplicationDao {
// } // }
} }
public void calculationProcessForFormula(ApplicationFormEntity applicationFormEntity, List<ContentResponseBean> contentResponseBeans, ApplicationFormFieldRequestBean applicationFormFieldRequestBean,FieldValidator fieldValidator) { public void calculationProcessForFormula(ApplicationFormEntity applicationFormEntity, List<ContentResponseBean> contentResponseBeans,String fromFieldId,String formFieldValue,FieldValidator fieldValidator) {
List<String> formulaValue = new ArrayList<>(); List<String> formulaValue = new ArrayList<>();
String formulaValueOpt=null; String formulaValueOpt=null;
String label=null; String label=null;
for (ContentResponseBean contentResponseBean:contentResponseBeans){ for (ContentResponseBean contentResponseBean:contentResponseBeans){
if(contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())){ if(contentResponseBean.getId().equals(fromFieldId)){
for (SettingResponseBean settingResponseBean:contentResponseBean.getSettings()){ for (SettingResponseBean settingResponseBean:contentResponseBean.getSettings()){
if (settingResponseBean.getName().equals("label")){ if (settingResponseBean.getName().equals("label")){
label= String.valueOf(settingResponseBean.getValue()); label= String.valueOf(settingResponseBean.getValue());
@@ -1684,7 +1689,7 @@ public class ApplicationDao {
} }
} }
Map<String, String> mappedFormulaValue = new HashMap<>(); Map<String, String> mappedFormulaValue = new HashMap<>();
Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); Object fieldValue = formFieldValue;
if (formulaValueOpt != null && fieldValue==null) { if (formulaValueOpt != null && fieldValue==null) {
fieldValue=0; fieldValue=0;
} }
@@ -2422,4 +2427,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

@@ -1155,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) {
@@ -1549,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());
@@ -1910,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();
@@ -1931,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);
@@ -1954,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());
@@ -1969,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());
@@ -1999,6 +2009,9 @@ 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());
String protocolNumber=application.getProtocol().getExternalProtocolNumber(); String protocolNumber=application.getProtocol().getExternalProtocolNumber();
@@ -2573,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

View File

@@ -154,6 +154,13 @@ public class AppointmentDao {
ApplicationEntity oldApplication = Utils.getClonedEntityForData(application); 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));
@@ -165,7 +172,7 @@ 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(NdgStatusEnum.NDG_INITITATED.getValue()); application.setNdgStatus(NdgStatusEnum.NDG_INITITATED.getValue());
applicationRepository.save(application); applicationRepository.save(application);

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

@@ -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

@@ -73,6 +73,9 @@ public class EmailNotificationDao {
@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) {
@@ -355,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

@@ -76,6 +76,9 @@ public class FormDao {
@Autowired @Autowired
private HttpServletRequest request; private HttpServletRequest request;
@Autowired
private ApplicationDao applicationDao;
public FormEntity saveFormEntity(FormEntity formEntity){ public FormEntity saveFormEntity(FormEntity formEntity){
formEntity=formRepository.save(formEntity); formEntity=formRepository.save(formEntity);
return formEntity; return formEntity;
@@ -419,6 +422,8 @@ public class FormDao {
.maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel,fieldValidatorBean.getMax(),contentResponseBean) // Only applies if maxLength is not null .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel,fieldValidatorBean.getMax(),contentResponseBean) // Only applies if maxLength is not null
.matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present
.validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here
// applicationDao.calculationProcessForFormula(applicationFormEntity,formResponseBean.getContent(),fieldId,value,validator);
if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) {
Long hubId = applicationEntity.getHubId(); Long hubId = applicationEntity.getHubId();
String error = validateVatNumber(value, fieldLabel,hubId); String error = validateVatNumber(value, fieldLabel,hubId);

View File

@@ -137,6 +137,7 @@ public class PdfDao {
Map<String, Boolean> stateFieldMap= new HashMap<>(); Map<String, Boolean> stateFieldMap= new HashMap<>();
Paragraph labelParagraph = new Paragraph(label, labelFont); Paragraph labelParagraph = new Paragraph(label, labelFont);
labelParagraph.setSpacingAfter(-10f);
document.add(labelParagraph); document.add(labelParagraph);
float leftMargin = 20f; float leftMargin = 20f;
PdfContentByte canvas = writer.getDirectContent(); PdfContentByte canvas = writer.getDirectContent();
@@ -202,7 +203,9 @@ public class PdfDao {
valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setPaddingLeft(leftMargin); // Increase left margin for value
valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell
valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners valueCell.setHorizontalAlignment(Element.ALIGN_LEFT);
valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners
valueTable.setSpacingAfter(-15f);
// Add the cell to the table // Add the cell to the table
valueTable.addCell(valueCell); valueTable.addCell(valueCell);
@@ -285,6 +288,7 @@ public class PdfDao {
valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); valueCell.setHorizontalAlignment(Element.ALIGN_LEFT);
valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners
valueTable.addCell(valueCell); valueTable.addCell(valueCell);
valueTable.setSpacingAfter(-15f);
document.add(valueTable); document.add(valueTable);
} }
} }
@@ -388,10 +392,12 @@ public class PdfDao {
if (Boolean.TRUE.equals(formulaEnabledMap.get(key)) && Boolean.TRUE.equals(GepafinConstant.NUMERIC.equalsIgnoreCase(fieldTypeMap.get(key)))) { if (Boolean.TRUE.equals(formulaEnabledMap.get(key)) && Boolean.TRUE.equals(GepafinConstant.NUMERIC.equalsIgnoreCase(fieldTypeMap.get(key)))) {
calculateValue(key, fieldValue, formulaTypeMap, columnSums); calculateValue(key, fieldValue, formulaTypeMap, columnSums);
} }
if(Boolean.TRUE.equals(Utils.isNumeric(fieldValue))){ String fieldLabel = stateFieldMap.getOrDefault(key, "");
fieldValue=Utils.convertToItalianFormat(fieldValue); if(Boolean.FALSE.equals(fieldLabel.equalsIgnoreCase("Anno"))) {
if (Boolean.TRUE.equals(Utils.isNumeric(fieldValue))) {
fieldValue = Utils.convertToItalianFormat(fieldValue);
}
} }
PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont); PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont);
dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell
dataCell.setMinimumHeight(30f); dataCell.setMinimumHeight(30f);
@@ -541,6 +547,8 @@ public class PdfDao {
labelCell.setBorder(Rectangle.NO_BORDER); labelCell.setBorder(Rectangle.NO_BORDER);
labelCell.setGrayFill(7); labelCell.setGrayFill(7);
labelCell.setPadding(5); labelCell.setPadding(5);
labelParagraph.setSpacingAfter(-10f);
// Create a PdfPTable with 1 column and add the PdfPCell to it // Create a PdfPTable with 1 column and add the PdfPCell to it
PdfPTable table = new PdfPTable(1); PdfPTable table = new PdfPTable(1);

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

@@ -61,4 +61,11 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity {
@Convert(converter = EmailSendResponseConverter.class) @Convert(converter = EmailSendResponseConverter.class)
@Column(name = "EMAIL_SEND_RESPONSE", columnDefinition = "TEXT") @Column(name = "EMAIL_SEND_RESPONSE", columnDefinition = "TEXT")
private List<EmailSendResponse> emailSendResponse; private List<EmailSendResponse> emailSendResponse;
@Column(name = "EXTENDED_DAYS")
private Long extendedDays;
@Column(name = "EXTENSION_DATE")
private LocalDateTime extensionDate;
} }

View File

@@ -76,4 +76,7 @@ public class ApplicationEntity extends BaseEntity {
@Column(name = "PEC_EMAIL") @Column(name = "PEC_EMAIL")
private String pecEmail; private String pecEmail;
@Column(name="VAT_NUMBER")
private String vatNumber;
} }

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

@@ -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

@@ -99,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

@@ -55,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

@@ -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

@@ -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"),

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

@@ -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

@@ -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

@@ -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

@@ -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;
@@ -1063,6 +1061,37 @@ public class Utils {
ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest);
RequestContextHolder.setRequestAttributes(attributes, true); 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

@@ -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

@@ -2955,6 +2955,13 @@
</addColumn> </addColumn>
</changeSet> </changeSet>
<changeSet id="03-06-2025_RK_182045" author="Rajesh Khore">
<addColumn tableName="application_amendment_request">
<column name="extended_days" type="INTEGER"></column>
<column name="extension_date" type="TIMESTAMP WITHOUT TIME ZONE"></column>
</addColumn>
</changeSet>
<changeSet id="05-06-2025_RK_191738" author="Rajesh Khore"> <changeSet id="05-06-2025_RK_191738" author="Rajesh Khore">
<sqlFile dbms="postgresql" <sqlFile dbms="postgresql"
path="db/dump/updated_form_field_05_06_2025.sql"/> path="db/dump/updated_form_field_05_06_2025.sql"/>
@@ -2987,4 +2994,32 @@
from gepafin_schema.ndganag), false) from gepafin_schema.ndganag), false)
</sql> </sql>
</changeSet> </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'
);

View File

@@ -0,0 +1,105 @@
DROP VIEW IF EXISTS gepafin_schema.application_form_view ;
CREATE OR REPLACE VIEW gepafin_schema.application_form_view AS
SELECT app_data.id,
app_data.call_id,
app_data.application_form_id,
app_data.form_id,
app_data.application_id,
field_data.value ->> 'id'::text AS field_id,
COALESCE(( SELECT s.value ->> 'value'::text
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'label'::text
LIMIT 1), field_data.value ->> 'label'::text) AS field_label,
( SELECT (s.value ->> 'value'::text)::boolean AS bool
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'reportEnable'::text
LIMIT 1) AS report_enable,
COALESCE(( SELECT s.value ->> 'value'::text
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'reportHeader'::text
LIMIT 1), field_data.value ->> 'reportHeader'::text) AS report_header,
field_data.value ->> 'name'::text AS field_type,
CASE
WHEN (field_data.value ->> 'name'::text) = 'fileupload'::text THEN to_jsonb(( SELECT string_agg(d.file_name::text, ', '::text) AS string_agg
FROM unnest(string_to_array(app_data.field_value, ','::text)) file_ids(file_id)
JOIN gepafin_schema.document d ON d.id::text = file_ids.file_id
WHERE d.is_deleted = false))
WHEN (field_data.value ->> 'name'::text) = ANY (ARRAY['checkboxes'::text, 'select'::text, 'radio'::text]) THEN
CASE
WHEN app_data.field_value ~~ '[%'::text THEN to_jsonb(( SELECT string_agg(opt.value ->> 'label'::text, ', '::text) AS string_agg
FROM jsonb_array_elements_text(app_data.field_value::jsonb) selected_id(value)
CROSS JOIN LATERAL ( SELECT s.value
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'options'::text) options_setting,
LATERAL jsonb_array_elements(options_setting.value -> 'value'::text) opt(value)
WHERE (opt.value ->> 'name'::text) = selected_id.value))
ELSE to_jsonb(( SELECT opt.value ->> 'label'::text
FROM ( SELECT s.value
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'options'::text) options_setting,
LATERAL jsonb_array_elements(options_setting.value -> 'value'::text) opt(value)
WHERE (opt.value ->> 'name'::text) = app_data.field_value
LIMIT 1))
END
ELSE to_jsonb(app_data.field_value)
END AS field_value,
app_data.status,
app_data.amount_requested,
app_data.amount_accepted,
app_data.is_deleted,
app_data.hub_id,
app_data.user_id,
app_data.evaluation_version,
app_data.company_id,
c.company_name,
c.vat_number AS company_vat_number,
c.codice_ateco,
c.codice_fiscale AS company_codice_fiscale,
p.protocol_number,
b.codice_fiscale AS user_codice_fiscale,
COALESCE(NULLIF(TRIM(BOTH FROM concat(COALESCE(u.first_name, ''::character varying), ' ', COALESCE(u.last_name, ''::character varying))), ''::text), ''::text) AS user_name,
COALESCE( NULLIF(TRIM(BOTH FROM CONCAT(COALESCE(aauser.first_name, ''), ' ', COALESCE(aauser.last_name, ''))),''),'NA') AS instructor_name,
uwc.is_legal_representant AS legal_representative,
cl.name AS call_title,
cl.end_date AS call_end_date,
cl.end_time AS call_end_time,
cl.start_date AS call_start_date,
cl.start_time AS call_start_time
FROM ( SELECT a.id AS application_id,
a.call_id,
a.protocol_number,
af.id AS application_form_id,
af.form_id,
aff.id,
aff.field_value,
a.status,
a.amount_requested,
a.amount_accepted,
a.is_deleted,
a.hub_id,
a.user_id,
a.evaluation_version,
a.created_date,
a.company_id,
aff.field_id,
f.content
FROM gepafin_schema.application a
JOIN gepafin_schema.application_form af ON af.application_id = a.id
JOIN gepafin_schema.application_form_field aff ON aff.application_form_id = af.id
JOIN gepafin_schema.form f ON f.id = af.form_id
WHERE a.is_deleted = false) app_data
CROSS JOIN LATERAL ( SELECT jsonb_array_elements.value
FROM jsonb_array_elements(app_data.content::jsonb) jsonb_array_elements(value)
WHERE (jsonb_array_elements.value ->> 'id'::text) = app_data.field_id::text) field_data(value)
LEFT JOIN gepafin_schema.call cl ON app_data.call_id = cl.id
LEFT JOIN gepafin_schema.company c ON app_data.company_id = c.id
LEFT JOIN gepafin_schema.protocol p ON app_data.protocol_number = p.id
LEFT JOIN gepafin_schema.gepafin_user u ON app_data.user_id = u.id
LEFT JOIN gepafin_schema.user_with_company uwc ON app_data.user_id = uwc.user_id AND app_data.company_id = uwc.company_id AND uwc.is_deleted = false
LEFT JOIN gepafin_schema.beneficiary b ON u.beneficiary_id = b.id
LEFT JOIN gepafin_schema.assigned_applications aa ON app_data.application_id = aa.application_id
LEFT JOIN gepafin_schema.gepafin_user aauser ON aa.user_id = aauser.id
WHERE app_data.id IS NOT NULL AND (app_data.status::text <> ALL (ARRAY['DRAFT'::character varying::text, 'AWAITING'::character varying::text, 'READY'::character varying::text]))
ORDER BY app_data.id, (field_data.value ->> 'id'::text);

View File

@@ -0,0 +1,108 @@
DROP VIEW IF EXISTS gepafin_schema.application_form_view ;
CREATE OR REPLACE VIEW gepafin_schema.application_form_view AS
SELECT app_data.id,
app_data.call_id,
app_data.application_form_id,
app_data.form_id,
app_data.application_id,
field_data.value ->> 'id'::text AS field_id,
COALESCE(( SELECT s.value ->> 'value'::text
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'label'::text
LIMIT 1), field_data.value ->> 'label'::text) AS field_label,
( SELECT (s.value ->> 'value'::text)::boolean AS bool
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'reportEnable'::text
LIMIT 1) AS report_enable,
COALESCE(( SELECT s.value ->> 'value'::text
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'reportHeader'::text
LIMIT 1), field_data.value ->> 'reportHeader'::text) AS report_header,
field_data.value ->> 'name'::text AS field_type,
CASE
WHEN (field_data.value ->> 'name'::text) = 'fileupload'::text THEN to_jsonb(( SELECT string_agg(d.file_name::text, ', '::text) AS string_agg
FROM unnest(string_to_array(app_data.field_value, ','::text)) file_ids(file_id)
JOIN gepafin_schema.document d ON d.id::text = file_ids.file_id
WHERE d.is_deleted = false))
WHEN (field_data.value ->> 'name'::text) = ANY (ARRAY['checkboxes'::text, 'select'::text, 'radio'::text]) THEN
CASE
WHEN app_data.field_value ~~ '[%'::text THEN to_jsonb(( SELECT string_agg(opt.value ->> 'label'::text, ', '::text) AS string_agg
FROM jsonb_array_elements_text(app_data.field_value::jsonb) selected_id(value)
CROSS JOIN LATERAL ( SELECT s.value
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'options'::text) options_setting,
LATERAL jsonb_array_elements(options_setting.value -> 'value'::text) opt(value)
WHERE (opt.value ->> 'name'::text) = selected_id.value))
ELSE to_jsonb(( SELECT opt.value ->> 'label'::text
FROM ( SELECT s.value
FROM jsonb_array_elements(field_data.value -> 'settings'::text) s(value)
WHERE (s.value ->> 'name'::text) = 'options'::text) options_setting,
LATERAL jsonb_array_elements(options_setting.value -> 'value'::text) opt(value)
WHERE (opt.value ->> 'name'::text) = app_data.field_value
LIMIT 1))
END
ELSE to_jsonb(app_data.field_value)
END AS field_value,
app_data.status,
app_data.amount_requested,
app_data.amount_accepted,
app_data.is_deleted,
app_data.hub_id,
app_data.user_id,
app_data.evaluation_version,
app_data.company_id,
c.company_name,
c.vat_number AS company_vat_number,
c.codice_ateco,
c.codice_fiscale AS company_codice_fiscale,
p.protocol_number,
DATE(app_data.submission_date) AS submission_date,
TO_CHAR(app_data.submission_date, 'HH24:MI:SS') AS submission_time,
b.codice_fiscale AS user_codice_fiscale,
COALESCE(NULLIF(TRIM(BOTH FROM concat(COALESCE(u.first_name, ''::character varying), ' ', COALESCE(u.last_name, ''::character varying))), ''::text), ''::text) AS user_name,
COALESCE( NULLIF(TRIM(BOTH FROM CONCAT(COALESCE(aauser.first_name, ''), ' ', COALESCE(aauser.last_name, ''))),''),'NA') AS instructor_name,
uwc.is_legal_representant AS legal_representative,
cl.name AS call_title,
cl.end_date AS call_end_date,
cl.end_time AS call_end_time,
cl.start_date AS call_start_date,
cl.start_time AS call_start_time
FROM ( SELECT a.id AS application_id,
a.call_id,
a.protocol_number,
af.id AS application_form_id,
af.form_id,
aff.id,
aff.field_value,
a.status,
a.amount_requested,
a.amount_accepted,
a.is_deleted,
a.hub_id,
a.user_id,
a.evaluation_version,
a.created_date,
a.company_id,
a.submission_date,
aff.field_id,
f.content
FROM gepafin_schema.application a
JOIN gepafin_schema.application_form af ON af.application_id = a.id
JOIN gepafin_schema.application_form_field aff ON aff.application_form_id = af.id
JOIN gepafin_schema.form f ON f.id = af.form_id
WHERE a.is_deleted = false) app_data
CROSS JOIN LATERAL ( SELECT jsonb_array_elements.value
FROM jsonb_array_elements(app_data.content::jsonb) jsonb_array_elements(value)
WHERE (jsonb_array_elements.value ->> 'id'::text) = app_data.field_id::text) field_data(value)
LEFT JOIN gepafin_schema.call cl ON app_data.call_id = cl.id
LEFT JOIN gepafin_schema.company c ON app_data.company_id = c.id
LEFT JOIN gepafin_schema.protocol p ON app_data.protocol_number = p.id
LEFT JOIN gepafin_schema.gepafin_user u ON app_data.user_id = u.id
LEFT JOIN gepafin_schema.user_with_company uwc ON app_data.user_id = uwc.user_id AND app_data.company_id = uwc.company_id AND uwc.is_deleted = false
LEFT JOIN gepafin_schema.beneficiary b ON u.beneficiary_id = b.id
LEFT JOIN gepafin_schema.assigned_applications aa ON app_data.application_id = aa.application_id
LEFT JOIN gepafin_schema.gepafin_user aauser ON aa.user_id = aauser.id
WHERE app_data.id IS NOT NULL AND (app_data.status::text <> ALL (ARRAY['DRAFT'::character varying::text, 'AWAITING'::character varying::text, 'READY'::character varying::text]))
ORDER BY app_data.id, (field_data.value ->> 'id'::text);

View File

@@ -0,0 +1,62 @@
DROP VIEW IF EXISTS gepafin_schema.assigned_applications_view ;
CREATE OR REPLACE VIEW gepafin_schema.assigned_applications_view AS
SELECT
-- From assigned_applications
aa.id AS id,
aa.user_id AS user_id,
aa.status AS status,
aa.created_date AS created_date,
aa.updated_date AS updated_date,
aa.is_deleted AS is_deleted,
-- From application
a.id AS application_id,
a.hub_id as hub_id,
a.status AS application_status,
a.submission_date AS submission_date,
ae.end_date AS evaluation_end_date,
a.ndg AS ndg,
a.appointment_id AS appointment_id,
-- From protocol (OneToOne)
p.protocol_number AS protocol_number,
-- From call (ManyToOne)
cl.name AS call_name,
-- From company (ManyToOne)
c.company_name AS company_name,
ae.email_send_response AS email_send_response,
COALESCE(NULLIF(TRIM(BOTH FROM concat(COALESCE(u.first_name, ''::character varying), ' ', COALESCE(u.last_name, ''::character varying))), ''::text), ''::text) AS assigned_user_name
FROM gepafin_schema.assigned_applications aa
-- Join application (ManyToOne from assigned_applications)
LEFT JOIN gepafin_schema.application a
ON aa.application_id = a.id
AND (a.is_deleted IS FALSE OR a.is_deleted IS NULL)
-- Join application_evaluation (application_id matches + not deleted)
LEFT JOIN gepafin_schema.application_evaluation ae
ON ae.application_id = a.id
AND (ae.is_deleted IS FALSE OR ae.is_deleted IS NULL)
-- Join protocol (OneToOne from application)
LEFT JOIN gepafin_schema.protocol p
ON a.protocol_number = p.id
-- Join call (ManyToOne from application)
LEFT JOIN gepafin_schema.call cl
ON a.call_id = cl.id
-- Join company (ManyToOne from application)
LEFT JOIN gepafin_schema.company c
ON a.company_id = c.id
LEFT JOIN gepafin_schema.gepafin_user u ON aa.user_id = u.id
WHERE aa.is_deleted IS FALSE OR aa.is_deleted IS NULL;

View File

@@ -410,3 +410,6 @@ no.email.log.msg = No failed emails found for given userActionId.
user.action.id.not.found = User Action id not found. user.action.id.not.found = User Action id not found.
ndg.not.found=NDG not found. ndg.not.found=NDG not found.
email.pec.cannot.null=Email pec is required. email.pec.cannot.null=Email pec is required.
user.request.completed=User request completed successfully.
end.date.greater.than.now=End date must be greater than the current date and time.

View File

@@ -401,3 +401,6 @@ no.email.log.msg = Nessuna email trovata per userActionId specificato.
user.action.id.not.found = ID azione utente non trovato. user.action.id.not.found = ID azione utente non trovato.
ndg.not.found=NDG non trovato. ndg.not.found=NDG non trovato.
email.pec.cannot.null=L'indirizzo email pec è obbligatorio. email.pec.cannot.null=L'indirizzo email pec è obbligatorio.
user.request.completed=Richiesta utente completata con successo.
end.date.greater.than.now=La data di fine deve essere successiva alla data e all'ora correnti.