Merge pull request #229 from Kitzanos/feature/GEPAFINBE-175

GEPAFINBE-175(Introducing New Status in Application: Technical Evaluation)
This commit is contained in:
rajeshkhore
2025-02-27 20:16:41 +05:30
committed by GitHub
10 changed files with 68 additions and 5 deletions

View File

@@ -478,6 +478,7 @@ public class GepafinConstant {
public static final String SWITCH="switch"; public static final String SWITCH="switch";
public static final String IS_CHECK_LIST_ITEM="isChecklistItem"; public static final String IS_CHECK_LIST_ITEM="isChecklistItem";
public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist"; public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist";
public static final String INSUFFICIENT_SCORE_MESSAGE ="insufficient.score.msg";
public static final String PEC_SERVICE_URL="https://ws.pecmassiva.com"; public static final String PEC_SERVICE_URL="https://ws.pecmassiva.com";
public static final String PEC_SERVICE_SEND_MAIL="/send"; public static final String PEC_SERVICE_SEND_MAIL="/send";
public static final String PEC_SERVICE_INBOX_MAIL="/quota/inbox"; public static final String PEC_SERVICE_INBOX_MAIL="/quota/inbox";

View File

@@ -1,5 +1,9 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Root;
import jakarta.persistence.criteria.*; import jakarta.persistence.criteria.*;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
@@ -918,8 +922,10 @@ public class ApplicationDao {
public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
log.info("Updating status for Application id : " + applicationId);
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
checkCallEndDate(applicationEntity.getCall()); checkCallEndDate(applicationEntity.getCall());
log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId());
//cloned entity for old application data //cloned entity for old application data
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
@@ -950,14 +956,22 @@ public class ApplicationDao {
sendMailToUserAndCompany(userEntity, applicationEntity); sendMailToUserAndCompany(userEntity, applicationEntity);
sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity);
applicationEntity.setStatus(status.getValue()); applicationEntity.setStatus(status.getValue());
log.info("Status updated to SUBMIT for applicationId: " + applicationId);
} }
if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) {
applicationEntity.setStatus(status.getValue()); applicationEntity.setStatus(status.getValue());
log.info("Status updated to DRAFT for applicationId: " + applicationId);
} }
if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){
applicationEntity.setStatus(status.getValue()); applicationEntity.setStatus(status.getValue());
log.info("Status updated to ADMISSIBLE for applicationId: " + applicationId);
emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(applicationEntity);
}
if(status.equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){
processTechnicalEvaluation(applicationId, applicationEntity, status);
} }
applicationEntity = applicationRepository.save(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
log.info("Application status updated successfully | applicationId: {}, newStatus: {}", applicationId, applicationEntity.getStatus());
if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) { if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) {
/** This code is responsible for adding a version history log for "Update application status" operation. **/ /** This code is responsible for adding a version history log for "Update application status" operation. **/
@@ -967,6 +981,43 @@ public class ApplicationDao {
return getApplicationResponse(applicationEntity); return getApplicationResponse(applicationEntity);
} }
private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusTypeEnum status){
Optional<ApplicationEvaluationEntity> evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId);
if (evaluationEntityOpt.isPresent()){
ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get();
String criteriaJson = evaluationEntity.getCriteria();
if (criteriaJson != null){
Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria());
if (totalScore > 40) {
applicationEntity.setStatus(status.getValue());
log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId);
}
else{
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE));
}
}
}
}
private Integer calculateTotalScore(String criteriaJson){
try {
ObjectMapper objectMapper = new ObjectMapper();
// Convert JSON string to List of Maps
List<Map<String, Object>> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() {
});
// Sum all scores (ignoring null scores)
Integer totalScore = criteriaList.stream()
.mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0)
.sum();
return totalScore;
}
catch (Exception e) {
log.error(" Error parsing criteria JSON: {}", e.getMessage());
return 0;
}
}
public Integer calculateProgress(Long totalSteps, Long completedSteps) { public Integer calculateProgress(Long totalSteps, Long completedSteps) {
if (FieldValidator.isNullOrZero(totalSteps)) { if (FieldValidator.isNullOrZero(totalSteps)) {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO));

View File

@@ -1899,7 +1899,7 @@ public class ApplicationEvaluationDao {
application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
application = applicationRepository.save(application); application = applicationRepository.save(application);
emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); // emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application);
} }
if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) {
application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));

View File

@@ -249,7 +249,7 @@ public class EmailNotificationDao {
sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,amendmentRequest.getId()); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,amendmentRequest.getId());
} }
public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) {
Map<String, String> bodyPlaceholders = new HashMap<>(); Map<String, String> bodyPlaceholders = new HashMap<>();
bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString());

View File

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

View File

@@ -8,7 +8,7 @@ public enum EmailScenarioTypeEnum {
APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"), APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"),
APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"), APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"),
APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"), APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"),
APPLICATION_APPROVED("APPLICATION_APPROVED"), APPLICATION_ADMISSIBLE("APPLICATION_ADMISSIBLE"),
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");

View File

@@ -2532,6 +2532,11 @@
newColumnName="appointment_template_id"/> newColumnName="appointment_template_id"/>
</changeSet> </changeSet>
<changeSet id="27-02-2025_RK_192415" author="Rajesh Khore">
<sqlFile dbms="postgresql"
path="db/dump/updated_system_email_template_email_scenario_27_02_2025.sql"/>
</changeSet>
<changeSet id="26-02-2025_NK_180530" author="Nisha Kashyap"> <changeSet id="26-02-2025_NK_180530" author="Nisha Kashyap">
<sqlFile dbms="postgresql" <sqlFile dbms="postgresql"
path="db/dump/updated_hub_data_for_email_service_config_25-02-2025.sql"/> path="db/dump/updated_hub_data_for_email_service_config_25-02-2025.sql"/>

View File

@@ -0,0 +1,2 @@
UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_ADMISSIBLE' WHERE "type"='ADMISSIBILITY_NOTIFICATION' AND "system"=true ;

View File

@@ -390,7 +390,8 @@ company.document.copied.successfully = Company Document Copied successfully.
invalid.expiration.date = Invalid Expiration Date invalid.expiration.date = Invalid Expiration Date
appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id.
appointment.not.created = Appointment not created please try again. appointment.not.created = Appointment not created please try again.
validation.failed.checklist=Validation failed for checklist. validation.failed.checklist=Validation failed for checklist.
insufficient.score.msg = Insufficient score to pass to the technical and economic-financial evaluation

View File

@@ -384,3 +384,5 @@ invalid.expiration.date = Data di scadenza non valida
appointment.cannot.be.created = Impossibile creare l'appuntamento perch<63> la chiamata non ha l'ID del modello di appuntamento. appointment.cannot.be.created = Impossibile creare l'appuntamento perch<63> la chiamata non ha l'ID del modello di appuntamento.
appointment.not.created = Appuntamento non creato, riprova appointment.not.created = Appuntamento non creato, riprova
validation.failed.checklist=Convalida fallita per la checklist. validation.failed.checklist=Convalida fallita per la checklist.
insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria