From f9e9673d9391184070ce272bf7b3d7b8a139701f Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 13 Jan 2025 16:28:01 +0530 Subject: [PATCH 01/81] Done ticket GEPAFINBE-128 --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/UserActionDao.java | 138 ++++++++++ .../entities/RoleActionContextEntity.java | 29 ++ .../enums/TimePeriodEnum.java | 22 ++ .../enums/UserActionContextEnum.java | 4 +- .../response/SummaryPageResponseBean.java | 19 ++ .../response/UserActionResponseBean.java | 22 ++ .../AssignedApplicationsRepository.java | 4 +- .../RoleActionContextRepository.java | 16 ++ .../repositories/UserActionsRepository.java | 16 +- .../service/UserActionService.java | 9 + .../service/impl/UserActionServiceImpl.java | 28 ++ .../web/rest/api/UserActionApi.java | 33 +++ .../api/impl/UserActionApiController.java | 43 +++ .../db/changelog/db.changelog-1.0.0.xml | 26 ++ .../insert_action_context_data_09_01_2025.sql | 249 ++++++++++++++++++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 4 +- 18 files changed, 661 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/TimePeriodEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/UserActionResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/UserActionService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java create mode 100644 src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index bbbeb1eb..93a79d21 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -353,5 +353,7 @@ public class GepafinConstant { public static final String NOTIFICATION_DELETED_SUCCESSFULLY="notification.deleted.successfully"; public static final String NOTIFICATION_UPDATED_SUCCESSFULLY="notification.updated.successfully"; public static final String USER_WITH_COMPANY_NOT_FOUND = "user.with.company.not.found"; + + public static final String USER_ACTION_FETCHED_SUCCESSFULLY = "user.action.fetched.successfully"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java new file mode 100644 index 00000000..2b70c5a1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java @@ -0,0 +1,138 @@ +package net.gepafin.tendermanagement.dao; + +import jakarta.persistence.criteria.Predicate; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.RoleActionContextEntity; +import net.gepafin.tendermanagement.entities.UserActionEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.response.UserActionResponseBean; +import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; +import net.gepafin.tendermanagement.repositories.RoleActionContextRepository; +import net.gepafin.tendermanagement.repositories.UserActionsRepository; +import net.gepafin.tendermanagement.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class UserActionDao { + + @Autowired + private UserService userService; + + @Autowired + private UserActionsRepository userActionsRepository; + + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; + + @Autowired + private RoleActionContextRepository roleActionContextRepository; + + public SummaryPageResponseBean getUserAction(HttpServletRequest request, UserEntity userEntity, TimePeriodEnum timeFilter, String actionContext){ + Long numberOfLoginAttempts = userActionsRepository.countUserLoginAttempts(userEntity.getId()); + Long applicationsProcessed = assignedApplicationsRepository.countAssignedApplicationsByUserId(userEntity.getId()); + + List actionContextLabel = roleActionContextRepository.findByRoleIdAndIsDeletedFalse(userEntity.getRoleEntity().getId()); + + List userActions = getFilterUserActions(userEntity.getId(),timeFilter,actionContext); + + return createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,actionContextLabel,userActions); + } + + public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed, List actionContextLabel, List userActions){ + SummaryPageResponseBean response = new SummaryPageResponseBean(); + response.setRole(user.getRoleEntity().getRoleName()); + response.setLastLogin(user.getLastLogin()); + response.setRegistrationDate(user.getCreatedDate()); + response.setUsername(user.getFirstName()); + response.setEmail(user.getEmail()); + response.setNumberOfLoginAttempts(numberOfLoginAttempts); + response.setApplicationsProcessed(applicationsProcessed); + List actionContextNames = actionContextLabel.stream() + .map(RoleActionContextEntity::getActionContext) + .collect(Collectors.toList()); + + response.setActionContextLabels(actionContextNames); + + List userAction = convertEntityToResponse(userActions); + response.setUserActions(userAction); + return response; + } + + + public List getFilterUserActions(Long userId ,TimePeriodEnum timeFilter, String actionContext) { + LocalDateTime endDate = LocalDateTime.now(); + LocalDateTime startDate = (timeFilter != null) ? getStartTimeFromFilter(timeFilter) : null; + Pageable pageable = PageRequest.of(0, 25); + + Specification spec = getUserActionsSpecification(userId, startDate, endDate, actionContext); + Page pageResult = userActionsRepository.findAll(spec, pageable); + + return pageResult.getContent(); + } + + private LocalDateTime getStartTimeFromFilter(TimePeriodEnum timeFilter) { + LocalDateTime now = LocalDateTime.now(); + + if (timeFilter.equals(TimePeriodEnum.LAST_WEEK)) { + return now.minusDays(7); + } else if (timeFilter.equals(TimePeriodEnum.LAST_QUARTER)) { + return now.minusMonths(4); + } else if (timeFilter.equals(TimePeriodEnum.LAST_SEMESTER)) { + return now.minusMonths(6); + } else if (timeFilter.equals(TimePeriodEnum.LAST_YEAR)) { + return now.minusYears(1); + } else { + return null; + } + } + + public Specification getUserActionsSpecification(Long userId, LocalDateTime startDate, LocalDateTime endDate, String actionContext) { + return (root, query, builder) -> { + Predicate predicate = builder.isFalse(root.get("isDeleted")); + + predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + + if (startDate != null && endDate != null) { + predicate = builder.and(predicate, builder.between(root.get("createdDate"), startDate, endDate)); + } + + if (actionContext != null) { + predicate = builder.and(predicate, builder.equal(root.get("actionContext"), actionContext)); + } + + query.orderBy(builder.desc(root.get("createdDate"))); + + return predicate; + }; + } + + private List convertEntityToResponse(List userActions) { + return userActions.stream().map(action -> { + UserActionResponseBean responseBean = new UserActionResponseBean(); + responseBean.setId(action.getId()); + responseBean.setUserId(action.getUserId()); + responseBean.setActionType(action.getActionType()); + responseBean.setRequestBody(action.getRequestBody()); + responseBean.setLoginAttemptId(action.getLoginAttemptId()); + responseBean.setIpAddress(action.getIpAddress()); + responseBean.setActionContext(action.getActionContext()); + responseBean.setHubId(action.getHubId()); + responseBean.setUrl(action.getUrl()); + responseBean.setResponse(action.getResponse()); + responseBean.setCreatedDate(action.getCreatedDate()); + responseBean.setUpdatedDate(action.getUpdatedDate()); + return responseBean; + }).collect(Collectors.toList()); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java new file mode 100644 index 00000000..a3ff676f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Data +@Table(name ="role_action_context") +public class RoleActionContextEntity extends BaseEntity { + + @Column(name = "action_context") + private String actionContext; + + @Column(name = "role_id") + private Long roleId; + + @Column(name="is_deleted") + private Boolean isDeleted; + + @Column(name = "is_viewed") + private Boolean isViewed; + + @Column(name = "description") + private String description; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/TimePeriodEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/TimePeriodEnum.java new file mode 100644 index 00000000..fc342727 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/TimePeriodEnum.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum TimePeriodEnum { + + LAST_WEEK ("LAST_WEEK"), + LAST_QUARTER("LAST_QUARTER"), + LAST_SEMESTER("LAST_SEMESTER"), + LAST_YEAR("LAST_YEAR"); + + private String value; + + TimePeriodEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 20f917fe..0b7b8c63 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -161,7 +161,9 @@ public enum UserActionContextEnum { /** appointment action context **/ CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), CREATE_APPOINTMENT("CREATE_APPOINTMENT"), - UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"); + UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), + + GET_USER_ACTION("GET_USER_ACTION"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java new file mode 100644 index 00000000..aa4d96e4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class SummaryPageResponseBean { + private String username; + private String email; + private String role; + private LocalDateTime lastLogin; + private LocalDateTime registrationDate; + private Long numberOfLoginAttempts; + private Long applicationsProcessed; + private List actionContextLabels; + private List userActions; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/UserActionResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/UserActionResponseBean.java new file mode 100644 index 00000000..f8b15d3f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/UserActionResponseBean.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class UserActionResponseBean { + private Long id; + private Long userId; + private String actionType; + private String requestBody; + private Long loginAttemptId; + private String actionContext; + private String ipAddress; + private String methodType; + private Long hubId; + private String url; + private String response; + private LocalDateTime createdDate; + private LocalDateTime updatedDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 164dcb0a..dac54c98 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -20,6 +20,6 @@ public interface AssignedApplicationsRepository extends JpaRepository 'CLOSE'") + Long countAssignedApplicationsByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java new file mode 100644 index 00000000..4af9a314 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.RoleActionContextEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface RoleActionContextRepository extends JpaRepository, JpaSpecificationExecutor { + + List findByRoleIdAndIsDeletedFalse(Long roleId); + + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserActionsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserActionsRepository.java index f0163c47..a1bfbc7f 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserActionsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserActionsRepository.java @@ -2,9 +2,23 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserActionEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import org.springframework.data.domain.Pageable; +import java.time.LocalDateTime; +import java.util.List; @Repository -public interface UserActionsRepository extends JpaRepository { +public interface UserActionsRepository extends JpaRepository , JpaSpecificationExecutor { UserActionEntity findUserActionById(Long id); + + @Query("SELECT COUNT(u) FROM UserActionEntity u " + + "WHERE u.userId = :userId " + + "AND u.actionContext = 'USER_LOGIN' " + + "AND u.isDeleted = false") + Long countUserLoginAttempts(@Param("userId") Long userId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java new file mode 100644 index 00000000..1e010919 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; + +public interface UserActionService { + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java new file mode 100644 index 00000000..334dd933 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.UserActionDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.service.UserActionService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UserActionServiceImpl implements UserActionService { + + @Autowired + private UserActionDao userActionDao; + + @Autowired + private Validator validator; + + + @Override + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext) { + UserEntity user = validator.validateUserId(request, userId); + return userActionDao.getUserAction(request,user,timeFilter,actionContext); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java new file mode 100644 index 00000000..e0e62e84 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java @@ -0,0 +1,33 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + +public interface UserActionApi { + @Operation(summary = "Api to get user action", + 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 = "/{userId}", produces = { "application/json" }) + ResponseEntity> getUserAction(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @Parameter(description = "Time Filter") @RequestParam(value = "timeFilter", required = false) TimePeriodEnum timeFilter, + @Parameter(description = "Action Context") @RequestParam(value = "actionContext", required = false) String actionContext); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java new file mode 100644 index 00000000..3aa083c5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java @@ -0,0 +1,43 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.UserActionService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.UserActionApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/userAction}") +public class UserActionApiController implements UserActionApi { + + @Autowired + private UserActionService userActionService; + + @Autowired + private LoggingUtil loggingUtil; + + @Override + public ResponseEntity> getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext) { + + /** This code is responsible for creating user action logs for the "get user action" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_USER_ACTION).build()); + SummaryPageResponseBean userActionResponse= userActionService.getUserAction(request,userId,timeFilter,actionContext); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(userActionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_ACTION_FETCHED_SUCCESSFULLY))); + } +} + diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 0fdebf9e..6c88daed 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2123,4 +2123,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql b/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql new file mode 100644 index 00000000..264c92b1 --- /dev/null +++ b/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql @@ -0,0 +1,249 @@ +INSERT INTO role_action_context (action_context, role_id, is_deleted, is_viewed, description ,created_date, updated_date) VALUES +('CREATE_CALL_STEP_1', 2, false, false,'CREATE_CALL_STEP_1', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_CALL_STEP_1', 2, false, false, 'UPDATE_CALL_STEP_1','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_CALL_STEP_2', 2, false, false, 'CREATE_UPDATE_CALL_STEP_2','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_CALL', 2, false, false,'CONVALIDA CHIAMATA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_CALL_STATUS', 2, false, false, 'AGGIORNA STATO CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_CALL', 1, false, false, 'OTTIENI CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_CALL', 2, false, false, 'OTTIENI CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 2 ,false, false, 'SCARICA DOCUMENTO CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 1 ,false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 3,false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 5 , false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_USER', 1, false, false, 'CREA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_USER', 2, false, false, 'CREA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 1, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 2, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 3, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 5, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 1, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 2, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 3, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 5, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_USER', 2, false, false, 'OTTIENI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 1, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 3, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 5, false, false,'AGGIORNA DETTAGLI UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_USER', 2, false, false, 'ELIMINA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('VALIDATE_NEW_USER_WITH_SPID_TOKEN', 1, false, false, 'VALIDA NUOVO UTENTE CON TOKEN SPID','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_EXISTING_USER_WITH_SPID_TOKEN', 1, false, false,'VALIDA UTENTE ESISTENTE CON TOKEN SPID','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_VALID_USER_DETAILS', 1, false, false, 'OTTIENI DETTAGLI UTENTE VALIDO','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_VALID_USER_DETAILS', 2, false, false,'OTTIENI DETTAGLI UTENTE VALIDO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_USERS_BY_ROLE', 2, false, false,'OTTIENI TUTTI GLI UTENTI PER RUOLO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_USERS_BY_ROLE', 5, false, false,'OTTIENI TUTTI GLI UTENTI PER RUOLO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_APPLICATION', 2, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 1, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 3, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 5, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_FORM', 1, false, false, 'CREA/AGGIORNA FORM APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_FORM', 2, false, false, 'CREA/AGGIORNA FORM APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPLICATION', 1, false, false, 'CREA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPLICATION', 2, false, false, 'CREA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION', 1, false, false, 'ELIMINA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION', 2, false, false, 'ELIMINA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_APPLICATION', 1, false, false, 'OTTIENI TUTTE LE APPLICAZIONI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_APPLICATION', 2, false, false, 'OTTIENI TUTTE LE APPLICAZIONI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('UPDATE_APPLICATION_STATUS', 2, false, false, 'AGGIORNA STATO DELL APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_APPLICATION', 2, false, false, 'VALIDA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_SIGNED_DOCUMENT', 2, false, false, 'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_PDF', 2, false, false, 'SCARICA PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_SIGNED_DOCUMENT', 2, false, false, 'OTTIENI DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_NEXT_PREVIOUS_FORM', 2, false, false, 'OTTIENI FORM SUCCESSIVO/PRECEDENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_APPLICATION_DOC_ZIP', 2, false, false, 'SCARICA DOCUMENTI DELL APPLICAZIONE IN ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + + +('UPDATE_APPLICATION_STATUS', 1, false, false, 'AGGIORNA STATO DELL APPLICAZIONE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_APPLICATION', 1, false, false,'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_SIGNED_DOCUMENT', 1, false, false, 'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_PDF', 1, false, false, 'SCARICA PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_SIGNED_DOCUMENT', 1, false, false, 'OTTIENI DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_NEXT_PREVIOUS_FORM', 1, false, false, 'OTTIENI FORM SUCCESSIVO/PRECEDENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_APPLICATION_DOC_ZIP', 1, false, false, 'SCARICA DOCUMENTI DELL APPLICAZIONE IN ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_FAQ', 2, false, false, 'CREA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FAQ', 2, false, false, 'OTTIENI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FAQ_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FAQ', 2, false, false, 'ELIMINA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_FAQ', 1, false, false, 'CREA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FAQ', 1, false, false, 'OTTIENI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FAQ_DETAILS', 1, false, false, 'AGGIORNA DETTAGLI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FAQ', 1, false, false, 'ELIMINA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_COMPANY', 1, false, false, 'CREA AZIENDA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 1, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 2, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 5, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 3, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMPANY', 1, false, false, 'AGGIORNA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY', 2, false, false, 'ELIMINA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY', 1, false, false, 'ELIMINA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_COMPANY_DELEGATION', 1, false, false, 'CARICA DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_COMPANY_DELEGATION_TEMPLATE', 1, false, false, 'SCARICA MODELLO DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 1, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 2, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 3, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 5, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY_DELEGATION', 1, false, false, 'ELIMINA DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CHECK_COMPANY_VAT_NUMBER', 1, false, false, 'VERIFICA PARTITA IVA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CHECK_COMPANY_VAT_NUMBER', 2, false, false, 'VERIFICA PARTITA IVA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_BY_USER', 2, false, false, 'OTTIENI AZIENDA PER UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_BY_USER', 1, false, false, 'OTTIENI AZIENDA PER UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('REMOVE_COMPANY_FROM_USER', 2, false, false, 'RIMUOVI AZIENDA DA UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + + +('CREATE_LOOKUP_DATA', 2, false, false, 'CREA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_LOOKUP_DATA', 2, false, false, 'ELIMINA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_LOOKUP_DATA', 2, false, false, 'AGGIORNA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 2, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 3, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 5, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 2, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 3, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 5, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_HUB', 2, false, false, 'CREA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_HUB', 2, false, false, 'OTTIENI HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_HUB', 2, false, false, 'ELIMINA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_HUB', 2, false, false, 'AGGIORNA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_HUB', 2, false, false, 'OTTIENI TUTTI GLI HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_HUB_BY_UUID', 2, false, false, 'OTTIENI HUB PER UUID', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_AMENDMENT', 3, false, false, 'CREA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_AMENDMENT', 5, false, false, 'CREA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT', 3, false, false, 'OTTIENI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT', 5, false, false, 'OTTIENI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CLOSE_AMENDMENT', 3, false, false, 'CHIUDI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CLOSE_AMENDMENT', 5, false, false, 'CHIUDI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT', 3, false, false, 'AGGIORNA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT', 5, false, false, 'AGGIORNA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_AMENDMENT', 3, false, false, 'ELIMINA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_AMENDMENT', 5, false, false, 'ELIMINA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT_STATUS', 3, false, false, 'AGGIORNA STATO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT_STATUS', 5, false, false, 'AGGIORNA STATO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 3, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE PREIISTRUTTORE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 5, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE PREIISTRUTTORE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_BENEFICIARY_USER_ID', 1, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_BY_APPLICATION_ID', 3, false, false, 'OTTIENI MODIFICA PER ID DOMANDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_BY_APPLICATION_ID', 5, false, false, 'OTTIENI MODIFICA PER ID DOMANDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 3, false, false, 'ESTENDI GIORNI RISPOSTA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 5, false, false, 'ESTENDI GIORNI RISPOSTA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_DATA_FOR_AMENDMENT', 3, false, false, 'OTTIENI DATI DOMANDA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_DATA_FOR_AMENDMENT', 5, false, false, 'OTTIENI DATI DOMANDA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + + +('CREATE_UPDATE_APPLICATION_EVALUATION', 3, false, false, 'CREA/AGGIORNA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_EVALUATION', 5, false, false, 'CREA/AGGIORNA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_EVALUATION', 3, false, false, 'OTTIENI VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_EVALUATION', 5, false, false, 'OTTIENI VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION_EVALUATION', 3, false, false, 'ELIMINA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION_EVALUATION', 5, false, false, 'ELIMINA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'CREA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'CREA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'ELIMINA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'ELIMINA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'OTTIENI CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'OTTIENI CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'AGGIORNA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'AGGIORNA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_ASSIGNED_APPLICATION', 2, false, false, 'CREA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_ASSIGNED_APPLICATION', 5, false, false, 'CREA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_ASSIGNED_APPLICATION', 2, false, false, 'ELIMINA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_ASSIGNED_APPLICATION', 5, false, false, 'ELIMINA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 2, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 3, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 5, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_ASSIGNED_APPLICATION_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_ASSIGNED_APPLICATION_DETAILS', 5, false, false, 'AGGIORNA DETTAGLI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_FORM_FIELD', 2, false, false, 'CREA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FORM_FIELD', 2, false, false, 'AGGIORNA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FORM_FIELD', 2, false, false, 'OTTIENI CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FORM_FIELD', 2, false, false, 'ELIMINA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('UPLOAD_CALL_DOCUMENT', 2, false, false, 'CARICA DOCUMENTO CHIAMATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_CALL_IMAGES', 2, false, false, 'CARICA IMMAGINI CHIAMATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_APPLICATION_DOCUMENT', 1, false, false, 'CARICA DOCUMENTO APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_APPLICATION_IMAGES', 1, false, false, 'CARICA IMMAGINI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 2, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 1, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 3, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 5, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 2, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 1, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 3, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 5, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 2, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 1, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 3, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 5, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 2, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 1, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 3, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 5, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + + +('UPLOAD_AMENDMENT_DOCUMENT', 3, false, false, 'CARICA DOCUMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_DOCUMENT', 5, false, false, 'CARICA DOCUMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_IMAGES', 3, false, false, 'CARICA IMMAGINI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_IMAGES', 5, false, false, 'CARICA IMMAGINI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOCUMENT', 3, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOCUMENT', 5, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_IMAGES', 3, false, false, 'CARICA IMMAGINI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_IMAGES', 5, false, false, 'CARICA IMMAGINI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_UPDATE_FLOW', 2, false, false, 'CREA/AGGIORNA FLUSSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FLOW', 2, false, false, 'OTTIENI FLUSSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_LOGIN_ATTEMPT_LIST', 2, false, false, 'OTTIENI LISTA TENTATIVI ACCESSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('ADD_LOGIN_ATTEMPT', 2, false, false, 'AGGIUNGI TENTATIVO ACCESSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN', 2, false, false, 'OTTENERE WIDGET CRUSCOTTO PER SUPER ADMIN', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DASHBOARD_WIDGET_FOR_BENEFICIARY', 1, false, false, 'OTTENERE WIDGET CRUSCOTTO PER BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_EVALUATION_CRITERIA', 2, false, false, 'OTTENERE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_EVALUATION_CRITERIA', 2, false, false, 'AGGIORNARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_EVALUATION_CRITERIA', 2, false, false, 'ELIMINARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_EVALUATION_CRITERIA', 2, false, false, 'CREARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOC', 3, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOC', 5, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + + +('ADD_COMMENT_TO_AMENDMENT_REQUEST', 3, false, false, 'AGGIUNGI COMMENTO ALLA RICHIESTA DI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('ADD_COMMENT_TO_AMENDMENT_REQUEST', 5, false, false, 'AGGIUNGI COMMENTO ALLA RICHIESTA DI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMMUNICATION_COMMENT', 3, false, false, 'AGGIORNARE COMMENTO COMUNICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMMUNICATION_COMMENT', 5, false, false, 'AGGIORNARE COMMENTO COMUNICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_COMMENT', 3, false, false, 'OTTENERE COMMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_COMMENT', 5, false, false, 'OTTENERE COMMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMMENT_FROM_AMENDMENT', 3, false, false, 'ELIMINARE COMMENTO DALLA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMMENT_FROM_AMENDMENT', 5, false, false, 'ELIMINARE COMMENTO DALLA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CREATE_FORM', 2, false, false, 'CREARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FORM', 2, false, false, 'AGGIORNARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FORM', 2, false, false, 'OTTENERE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FORM', 2, false, false, 'ELIMINARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('AMENDMENT_EXPIRATION_SCHEDULER', 2, false, false, 'PIANIFICATORE SCADENZA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EVALUATION_EXPIRATION_SCHEDULER', 2, false, false, 'PIANIFICATORE SCADENZA VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CHECK_OR_CREATE_NDG_CODE', 2, false, false, 'VERIFICARE O CREARE CODICE NDG', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPOINTMENT', 2, false, false, 'CREARE APPUNTAMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM', 2, false, false, 'CARICA DOCUMENTO NEL SISTEMA ESTERNO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_USER_ACTION', 2, false, false, 'OTTENERE AZIONE UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'); + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 290f40af..9d5d2b2f 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -345,3 +345,5 @@ notification.sent.successfully=Notification sent successfully. notification.deleted.successfully=Notification deleted successfully. notification.updated.successfully=Notification updated successfully. user.with.company.not.found = User with company not found for user or company. + +user.action.fetched.successfully = User action details fetched successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index f41e4f1c..3fbad290 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -334,4 +334,6 @@ notification.not.found=Notifica non trovata. notification.sent.successfully=Notifica inviata con successo. notification.deleted.successfully=Notifica eliminata con successo. notification.updated.successfully=Notifica aggiornata con successo. -user.with.company.not.found = Utente con azienda non trovato per utente o azienda. \ No newline at end of file +user.with.company.not.found = Utente con azienda non trovato per utente o azienda. + +user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. \ No newline at end of file From e9df9cdb44ece2a6aa86acdddd7186367a0f71b4 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 14 Jan 2025 13:13:39 +0530 Subject: [PATCH 02/81] updated code --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/UserActionDao.java | 54 ++- .../enums/UserActionContextEnum.java | 3 +- .../response/ActionContextLabelResponse.java | 12 + .../response/SummaryPageResponseBean.java | 1 - .../RoleActionContextRepository.java | 6 +- .../service/UserActionService.java | 8 +- .../service/impl/UserActionServiceImpl.java | 12 +- .../web/rest/api/UserActionApi.java | 20 +- .../api/impl/UserActionApiController.java | 17 +- .../db/changelog/db.changelog-1.0.0.xml | 2 +- .../insert_action_context_data_09_01_2025.sql | 425 +++++++++--------- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 14 files changed, 325 insertions(+), 238 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ActionContextLabelResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index af1218e4..449d5953 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -357,6 +357,7 @@ public class GepafinConstant { public static final String USER_WITH_COMPANY_NOT_FOUND = "user.with.company.not.found"; public static final String USER_ACTION_FETCHED_SUCCESSFULLY = "user.action.fetched.successfully"; + public static final String ACTION_CONTEXT_LABELS_FETCHED_SUCCESSFULLY = "action.context.labels.fetched.successfully"; //action log response public static final String STATUS_CODE_STRING = "statusCode"; public static final String GET_STATUS_CODE_STRING = "status"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java index 2b70c5a1..7cf5472f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.RoleActionContextEntity; import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.model.response.UserActionResponseBean; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; @@ -38,18 +41,16 @@ public class UserActionDao { @Autowired private RoleActionContextRepository roleActionContextRepository; - public SummaryPageResponseBean getUserAction(HttpServletRequest request, UserEntity userEntity, TimePeriodEnum timeFilter, String actionContext){ + public SummaryPageResponseBean getUserAction(HttpServletRequest request, UserEntity userEntity, TimePeriodEnum timeFilter, List actionContext){ Long numberOfLoginAttempts = userActionsRepository.countUserLoginAttempts(userEntity.getId()); Long applicationsProcessed = assignedApplicationsRepository.countAssignedApplicationsByUserId(userEntity.getId()); - List actionContextLabel = roleActionContextRepository.findByRoleIdAndIsDeletedFalse(userEntity.getRoleEntity().getId()); - List userActions = getFilterUserActions(userEntity.getId(),timeFilter,actionContext); - return createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,actionContextLabel,userActions); + return createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,userActions); } - public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed, List actionContextLabel, List userActions){ + public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed, List userActions){ SummaryPageResponseBean response = new SummaryPageResponseBean(); response.setRole(user.getRoleEntity().getRoleName()); response.setLastLogin(user.getLastLogin()); @@ -58,11 +59,6 @@ public class UserActionDao { response.setEmail(user.getEmail()); response.setNumberOfLoginAttempts(numberOfLoginAttempts); response.setApplicationsProcessed(applicationsProcessed); - List actionContextNames = actionContextLabel.stream() - .map(RoleActionContextEntity::getActionContext) - .collect(Collectors.toList()); - - response.setActionContextLabels(actionContextNames); List userAction = convertEntityToResponse(userActions); response.setUserActions(userAction); @@ -70,12 +66,17 @@ public class UserActionDao { } - public List getFilterUserActions(Long userId ,TimePeriodEnum timeFilter, String actionContext) { + public List getFilterUserActions(Long userId ,TimePeriodEnum timeFilter, List actionContextList) { LocalDateTime endDate = LocalDateTime.now(); LocalDateTime startDate = (timeFilter != null) ? getStartTimeFromFilter(timeFilter) : null; Pageable pageable = PageRequest.of(0, 25); - Specification spec = getUserActionsSpecification(userId, startDate, endDate, actionContext); +// String actionContextLabel = (actionContext != null) ? actionContext.toString() : null; + List actionContextLabels = (actionContextList != null && !actionContextList.isEmpty()) + ? actionContextList.stream().map(Enum::toString).collect(Collectors.toList()) + : null; + + Specification spec = getUserActionsSpecification(userId, startDate, endDate, actionContextLabels); Page pageResult = userActionsRepository.findAll(spec, pageable); return pageResult.getContent(); @@ -97,7 +98,7 @@ public class UserActionDao { } } - public Specification getUserActionsSpecification(Long userId, LocalDateTime startDate, LocalDateTime endDate, String actionContext) { + public Specification getUserActionsSpecification(Long userId, LocalDateTime startDate, LocalDateTime endDate, List actionContextList) { return (root, query, builder) -> { Predicate predicate = builder.isFalse(root.get("isDeleted")); @@ -107,10 +108,14 @@ public class UserActionDao { predicate = builder.and(predicate, builder.between(root.get("createdDate"), startDate, endDate)); } - if (actionContext != null) { - predicate = builder.and(predicate, builder.equal(root.get("actionContext"), actionContext)); - } + if (actionContextList != null && !actionContextList.isEmpty()) { + CriteriaBuilder.In inClause = builder.in(root.get("actionContext")); + for (String actionContext : actionContextList) { + inClause.value(actionContext); + } + predicate = builder.and(predicate, inClause); + } query.orderBy(builder.desc(root.get("createdDate"))); return predicate; @@ -135,4 +140,21 @@ public class UserActionDao { return responseBean; }).collect(Collectors.toList()); } + + public List getActionContextLabels(HttpServletRequest request, UserEntity userEntity){ + List actionContextLabel = roleActionContextRepository.findActionContextLabel(userEntity.getRoleEntity().getId()); + return convertRoleContextEntityToResponse(actionContextLabel); + } + + private List convertRoleContextEntityToResponse(List actionContextEntities){ + return actionContextEntities.stream().map(actionContext -> { + ActionContextLabelResponse responseBean = new ActionContextLabelResponse(); + responseBean.setId(actionContext.getId()); + responseBean.setActionContext(UserActionContextEnum.valueOf(actionContext.getActionContext())); + responseBean.setRoleId(actionContext.getRoleId()); + responseBean.setDescription(actionContext.getDescription()); + responseBean.setIsViewed(actionContext.getIsViewed()); + return responseBean; + }).collect(Collectors.toList()); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index cb3ec69f..7177f8d9 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -166,7 +166,8 @@ public enum UserActionContextEnum { CREATE_APPOINTMENT("CREATE_APPOINTMENT"), UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), - GET_USER_ACTION("GET_USER_ACTION"); + GET_USER_ACTION("GET_USER_ACTION"), + GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ActionContextLabelResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ActionContextLabelResponse.java new file mode 100644 index 00000000..988a8f07 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ActionContextLabelResponse.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; +import lombok.Data; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; + +@Data +public class ActionContextLabelResponse { + private Long id; + private UserActionContextEnum actionContext; + private Long roleId; + private Boolean isViewed; + private String description; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java index aa4d96e4..a15a6510 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java @@ -14,6 +14,5 @@ public class SummaryPageResponseBean { private LocalDateTime registrationDate; private Long numberOfLoginAttempts; private Long applicationsProcessed; - private List actionContextLabels; private List userActions; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java index 4af9a314..218f2c10 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/RoleActionContextRepository.java @@ -3,13 +3,17 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.RoleActionContextEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface RoleActionContextRepository extends JpaRepository, JpaSpecificationExecutor { - List findByRoleIdAndIsDeletedFalse(Long roleId); + @Query("SELECT r FROM RoleActionContextEntity r WHERE r.roleId = :roleId AND r.isDeleted = false AND r.isViewed = true") + List findActionContextLabel(@Param("roleId") Long roleId); + diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java index 1e010919..e12bae6a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java @@ -2,8 +2,14 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import java.util.List; + public interface UserActionService { - public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext); + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext); + + public List getActionContextLabels(HttpServletRequest request, Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java index 334dd933..65d692dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java @@ -4,12 +4,16 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.UserActionDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.service.UserActionService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class UserActionServiceImpl implements UserActionService { @@ -21,8 +25,14 @@ public class UserActionServiceImpl implements UserActionService { @Override - public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext) { + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext) { UserEntity user = validator.validateUserId(request, userId); return userActionDao.getUserAction(request,user,timeFilter,actionContext); } + + @Override + public List getActionContextLabels(HttpServletRequest request, Long userId) { + UserEntity user = validator.validateUserId(request, userId); + return userActionDao.getActionContextLabels(request,user); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java index e0e62e84..95d0f125 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserActionApi.java @@ -7,6 +7,8 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + public interface UserActionApi { @Operation(summary = "Api to get user action", responses = { @@ -26,8 +30,20 @@ public interface UserActionApi { @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 = "/{userId}", produces = { "application/json" }) + @GetMapping(value = "/user/{userId}", produces = { "application/json" }) ResponseEntity> getUserAction(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @Parameter(description = "Time Filter") @RequestParam(value = "timeFilter", required = false) TimePeriodEnum timeFilter, - @Parameter(description = "Action Context") @RequestParam(value = "actionContext", required = false) String actionContext); + @Parameter(description = "Action Context") @RequestParam(value = "actionContext", required = false) List actionContext); + + @Operation(summary = "Api to get action context label", + 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 = "/user/{userId}/action-context", produces = { "application/json" }) + ResponseEntity>> getActionContextLabels(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java index 3aa083c5..c65fbe2f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserActionApiController.java @@ -7,6 +7,7 @@ import net.gepafin.tendermanagement.enums.TimePeriodEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserActionService; @@ -19,6 +20,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/userAction}") public class UserActionApiController implements UserActionApi { @@ -30,7 +33,7 @@ public class UserActionApiController implements UserActionApi { private LoggingUtil loggingUtil; @Override - public ResponseEntity> getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, String actionContext) { + public ResponseEntity> getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext) { /** This code is responsible for creating user action logs for the "get user action" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) @@ -39,5 +42,17 @@ public class UserActionApiController implements UserActionApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(userActionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_ACTION_FETCHED_SUCCESSFULLY))); } + + @Override + public ResponseEntity>> getActionContextLabels(HttpServletRequest request, Long userId) { + + /** This code is responsible for creating user action logs for the "get user action context labels" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ACTION_CONTEXT_LABELS).build()); + + List actionContextResponse= userActionService.getActionContextLabels(request,userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(actionContextResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.ACTION_CONTEXT_LABELS_FETCHED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index bd23e10a..e40dff87 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2163,7 +2163,7 @@ - + diff --git a/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql b/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql index 264c92b1..9a159e8f 100644 --- a/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql +++ b/src/main/resources/db/dump/insert_action_context_data_09_01_2025.sql @@ -1,244 +1,243 @@ INSERT INTO role_action_context (action_context, role_id, is_deleted, is_viewed, description ,created_date, updated_date) VALUES -('CREATE_CALL_STEP_1', 2, false, false,'CREATE_CALL_STEP_1', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_CALL_STEP_1', 2, false, false, 'UPDATE_CALL_STEP_1','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_CALL_STEP_2', 2, false, false, 'CREATE_UPDATE_CALL_STEP_2','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('VALIDATE_CALL', 2, false, false,'CONVALIDA CHIAMATA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_CALL_STATUS', 2, false, false, 'AGGIORNA STATO CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_CALL', 1, false, false, 'OTTIENI CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_CALL', 2, false, false, 'OTTIENI CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_CALL_DOCUMENT', 2 ,false, false, 'SCARICA DOCUMENTO CHIAMA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_CALL_DOCUMENT', 1 ,false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_CALL_DOCUMENT', 3,false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_CALL_DOCUMENT', 5 , false, false,'SCARICA DOCUMENTO CHIAMA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_CALL_STEP_1', 2, false, true,'Create Call Step 1', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_CALL_STEP_1', 2, false, true, 'Update Call Step 1','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_CALL_STEP_2', 2, false, true, 'Create Update Call Step 2','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_CALL', 2, false, true,'Convalida Chiamata','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_CALL_STATUS', 2, false, true, 'Aggiorna Stato Chiama','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_CALL', 1, false, true, 'Ottieni Chiama','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_CALL', 2, false, true, 'Ottieni Chiama','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 2 ,false, true, 'Scarica Documento Chiama','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 1 ,false, true,'Scarica Documento Chiama', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 3,false, true,'Scarica Documento Chiama', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_CALL_DOCUMENT', 5 , false, true,'Scarica Documento Chiama', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_USER', 1, false, false, 'CREA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_USER', 2, false, false, 'CREA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('USER_LOGIN', 1, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('USER_LOGIN', 2, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('USER_LOGIN', 3, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('USER_LOGIN', 5, false, false, 'ACCESSO UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('LOGOUT_USER', 1, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('LOGOUT_USER', 2, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('LOGOUT_USER', 3, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('LOGOUT_USER', 5, false, false,'LOGOUT UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_USER', 2, false, false, 'OTTIENI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_USER_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_USER_DETAILS', 1, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_USER_DETAILS', 3, false, false, 'AGGIORNA DETTAGLI UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_USER_DETAILS', 5, false, false,'AGGIORNA DETTAGLI UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_USER', 2, false, false, 'ELIMINA UTENTE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_USER', 1, false, true, 'Crea Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_USER', 2, false, true, 'Crea Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 1, false, true, 'Accesso Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 2, false, true, 'Accesso Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 3, false, true, 'Accesso Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('USER_LOGIN', 5, false, true, 'Accesso Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 1, false, true,'Logout Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 2, false, true,'Logout Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 3, false, true,'Logout Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('LOGOUT_USER', 5, false, true,'Logout Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_USER', 2, false, true, 'Ottieni Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 2, false, true, 'Aggiorna Dettagli Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 1, false, true, 'Aggiorna Dettagli Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 3, false, true, 'Aggiorna Dettagli Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_USER_DETAILS', 5, false, true,'Aggiorna Dettagli Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_USER', 2, false, true, 'Elimina Utente','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('VALIDATE_NEW_USER_WITH_SPID_TOKEN', 1, false, false, 'VALIDA NUOVO UTENTE CON TOKEN SPID','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('VALIDATE_EXISTING_USER_WITH_SPID_TOKEN', 1, false, false,'VALIDA UTENTE ESISTENTE CON TOKEN SPID','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_VALID_USER_DETAILS', 1, false, false, 'OTTIENI DETTAGLI UTENTE VALIDO','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_VALID_USER_DETAILS', 2, false, false,'OTTIENI DETTAGLI UTENTE VALIDO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_USERS_BY_ROLE', 2, false, false,'OTTIENI TUTTI GLI UTENTI PER RUOLO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_USERS_BY_ROLE', 5, false, false,'OTTIENI TUTTI GLI UTENTI PER RUOLO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_NEW_USER_WITH_SPID_TOKEN', 1, false, true, 'Valida Nuovo Utente Con Token SPID', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_EXISTING_USER_WITH_SPID_TOKEN', 1, false, true, 'Valida Utente Esistente Con Token SPID', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_VALID_USER_DETAILS', 1, false, true, 'Ottieni Dettagli Utente Valido', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_VALID_USER_DETAILS', 2, false, true, 'Ottieni Dettagli Utente Valido', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_USERS_BY_ROLE', 2, false, true, 'Ottieni Tutti Gli Utenti Per Ruolo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_USERS_BY_ROLE', 5, false, true, 'Ottieni Tutti Gli Utenti Per Ruolo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION', 2, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION', 1, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION', 3, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION', 5, false, false, 'OTTIENI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_APPLICATION_FORM', 1, false, false, 'CREA/AGGIORNA FORM APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_APPLICATION_FORM', 2, false, false, 'CREA/AGGIORNA FORM APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_APPLICATION', 1, false, false, 'CREA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_APPLICATION', 2, false, false, 'CREA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_APPLICATION', 1, false, false, 'ELIMINA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_APPLICATION', 2, false, false, 'ELIMINA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_APPLICATION', 1, false, false, 'OTTIENI TUTTE LE APPLICAZIONI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_APPLICATION', 2, false, false, 'OTTIENI TUTTE LE APPLICAZIONI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 2, false, true, 'Ottieni Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 1, false, true, 'Ottieni Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 3, false, true, 'Ottieni Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION', 5, false, true, 'Ottieni Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_FORM', 1, false, true, 'Crea/Aggiorna Form Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_FORM', 2, false, true, 'Crea/Aggiorna Form Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPLICATION', 1, false, true, 'Crea Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPLICATION', 2, false, true, 'Crea Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION', 1, false, true, 'Elimina Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION', 2, false, true, 'Elimina Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_APPLICATION', 1, false, true, 'Ottieni Tutte Le Applicazioni', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_APPLICATION', 2, false, true, 'Ottieni Tutte Le Applicazioni', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_APPLICATION_STATUS', 2, false, false, 'AGGIORNA STATO DELL APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('VALIDATE_APPLICATION', 2, false, false, 'VALIDA APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_SIGNED_DOCUMENT', 2, false, false, 'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_PDF', 2, false, false, 'SCARICA PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_SIGNED_DOCUMENT', 2, false, false, 'OTTIENI DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_NEXT_PREVIOUS_FORM', 2, false, false, 'OTTIENI FORM SUCCESSIVO/PRECEDENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_APPLICATION_DOC_ZIP', 2, false, false, 'SCARICA DOCUMENTI DELL APPLICAZIONE IN ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_APPLICATION_STATUS', 2, false, true, 'Aggiorna Stato Dell Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_APPLICATION', 2, false, true, 'Valida Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_SIGNED_DOCUMENT', 2, false, true, 'Carica Documento Firmato', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_PDF', 2, false, true, 'Scarica PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_SIGNED_DOCUMENT', 2, false, true, 'Ottieni Documento Firmato', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_NEXT_PREVIOUS_FORM', 2, false, true, 'Ottieni Form Successivo/Precedente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_APPLICATION_DOC_ZIP', 2, false, true, 'Scarica Documenti Dell Applicazione In ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_APPLICATION_STATUS', 1, false, false, 'AGGIORNA STATO DELL APPLICAZIONE','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('VALIDATE_APPLICATION', 1, false, false,'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_SIGNED_DOCUMENT', 1, false, false, 'CARICA DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_PDF', 1, false, false, 'SCARICA PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_SIGNED_DOCUMENT', 1, false, false, 'OTTIENI DOCUMENTO FIRMATO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_NEXT_PREVIOUS_FORM', 1, false, false, 'OTTIENI FORM SUCCESSIVO/PRECEDENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_APPLICATION_DOC_ZIP', 1, false, false, 'SCARICA DOCUMENTI DELL APPLICAZIONE IN ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_APPLICATION_STATUS', 1, false, true, 'Aggiorna Stato Dell Applicazione','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('VALIDATE_APPLICATION', 1, false, true,'Valida Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_SIGNED_DOCUMENT', 1, false, true, 'Carica Documento Firmato', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_PDF', 1, false, true, 'Scarica PDF', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_SIGNED_DOCUMENT', 1, false, true, 'Ottieni Documento Firmato', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_NEXT_PREVIOUS_FORM', 1, false, true, 'Ottieni Form Successivo/Precedente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_APPLICATION_DOC_ZIP', 1, false, true, 'Scarica Documenti Dell Applicazione In ZIP', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_FAQ', 2, false, false, 'CREA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_FAQ', 2, false, false, 'OTTIENI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_FAQ_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_FAQ', 2, false, false, 'ELIMINA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_FAQ', 2, false, true, 'Crea Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FAQ', 2, false, true, 'Ottieni Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FAQ_DETAILS', 2, false, true, 'Aggiorna Dettagli Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FAQ', 2, false, true, 'Elimina Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_FAQ', 1, false, false, 'CREA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_FAQ', 1, false, false, 'OTTIENI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_FAQ_DETAILS', 1, false, false, 'AGGIORNA DETTAGLI FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_FAQ', 1, false, false, 'ELIMINA FAQ', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_FAQ', 1, false, true, 'Crea Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FAQ', 1, false, true, 'Ottieni Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FAQ_DETAILS', 1, false, true, 'Aggiorna Dettagli Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FAQ', 1, false, true, 'Elimina Faq', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_COMPANY', 1, false, false, 'CREA AZIENDA','2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY', 1, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY', 2, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY', 5, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY', 3, false, false, 'OTTIENI AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_COMPANY', 1, false, false, 'AGGIORNA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_COMPANY', 2, false, false, 'ELIMINA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_COMPANY', 1, false, false, 'ELIMINA AZIENDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_COMPANY_DELEGATION', 1, false, false, 'CARICA DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DOWNLOAD_COMPANY_DELEGATION_TEMPLATE', 1, false, false, 'SCARICA MODELLO DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_DELEGATION', 1, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_DELEGATION', 2, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_DELEGATION', 3, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_DELEGATION', 5, false, false, 'OTTIENI DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_COMPANY_DELEGATION', 1, false, false, 'ELIMINA DELEGA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CHECK_COMPANY_VAT_NUMBER', 1, false, false, 'VERIFICA PARTITA IVA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CHECK_COMPANY_VAT_NUMBER', 2, false, false, 'VERIFICA PARTITA IVA AZIENDALE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_BY_USER', 2, false, false, 'OTTIENI AZIENDA PER UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_COMPANY_BY_USER', 1, false, false, 'OTTIENI AZIENDA PER UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('REMOVE_COMPANY_FROM_USER', 2, false, false, 'RIMUOVI AZIENDA DA UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_COMPANY', 1, false, true, 'Crea Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 1, false, true, 'Ottieni Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 2, false, true, 'Ottieni Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 5, false, true, 'Ottieni Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY', 3, false, true, 'Ottieni Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMPANY', 1, false, true, 'Aggiorna Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY', 2, false, true, 'Elimina Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY', 1, false, true, 'Elimina Azienda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_COMPANY_DELEGATION', 1, false, true, 'Carica Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DOWNLOAD_COMPANY_DELEGATION_TEMPLATE', 1, false, true, 'Scarica Modello Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 1, false, true, 'Ottieni Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 2, false, true, 'Ottieni Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 3, false, true, 'Ottieni Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_DELEGATION', 5, false, true, 'Ottieni Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMPANY_DELEGATION', 1, false, true, 'Elimina Delega Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CHECK_COMPANY_VAT_NUMBER', 1, false, true, 'Verifica Partita Iva Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CHECK_COMPANY_VAT_NUMBER', 2, false, true, 'Verifica Partita Iva Aziendale', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_BY_USER', 2, false, true, 'Ottieni Azienda Per Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_COMPANY_BY_USER', 1, false, true, 'Ottieni Azienda Per Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('REMOVE_COMPANY_FROM_USER', 2, false, true, 'Rimuovi Azienda Da Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_LOOKUP_DATA', 2, false, false, 'CREA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_LOOKUP_DATA', 2, false, false, 'ELIMINA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_LOOKUP_DATA', 2, false, false, 'AGGIORNA DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA', 2, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA', 3, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA', 5, false, false, 'OTTIENI DATI DI RIFERIMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA_BY_TYPE', 2, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA_BY_TYPE', 3, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOOKUP_DATA_BY_TYPE', 5, false, false, 'OTTIENI DATI DI RIFERIMENTO PER TIPO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_LOOKUP_DATA', 2, false, true, 'Crea Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_LOOKUP_DATA', 2, false, true, 'Elimina Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_LOOKUP_DATA', 2, false, true, 'Aggiorna Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 2, false, true, 'Ottieni Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 3, false, true, 'Ottieni Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA', 5, false, true, 'Ottieni Dati Di Riferimento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 2, false, true, 'Ottieni Dati Di Riferimento Per Tipo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 3, false, true, 'Ottieni Dati Di Riferimento Per Tipo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOOKUP_DATA_BY_TYPE', 5, false, true, 'Ottieni Dati Di Riferimento Per Tipo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_HUB', 2, false, false, 'CREA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_HUB', 2, false, false, 'OTTIENI HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_HUB', 2, false, false, 'ELIMINA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_HUB', 2, false, false, 'AGGIORNA HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_HUB', 2, false, false, 'OTTIENI TUTTI GLI HUB', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_HUB_BY_UUID', 2, false, false, 'OTTIENI HUB PER UUID', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_HUB', 2, false, true, 'Crea Hub', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_HUB', 2, false, true, 'Ottieni Hub', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_HUB', 2, false, true, 'Elimina Hub', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_HUB', 2, false, true, 'Aggiorna Hub', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_HUB', 2, false, true, 'Ottieni Tutti Gli Hub', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_HUB_BY_UUID', 2, false, true, 'Ottieni Hub Per UUID', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_AMENDMENT', 3, false, false, 'CREA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_AMENDMENT', 5, false, false, 'CREA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT', 3, false, false, 'OTTIENI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT', 5, false, false, 'OTTIENI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CLOSE_AMENDMENT', 3, false, false, 'CHIUDI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CLOSE_AMENDMENT', 5, false, false, 'CHIUDI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_AMENDMENT', 3, false, false, 'AGGIORNA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_AMENDMENT', 5, false, false, 'AGGIORNA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_AMENDMENT', 3, false, false, 'ELIMINA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_AMENDMENT', 5, false, false, 'ELIMINA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_AMENDMENT_STATUS', 3, false, false, 'AGGIORNA STATO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_AMENDMENT_STATUS', 5, false, false, 'AGGIORNA STATO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 3, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE PREIISTRUTTORE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 5, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE PREIISTRUTTORE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ALL_AMENDMENT_BY_BENEFICIARY_USER_ID', 1, false, false, 'OTTIENI TUTTE LE MODIFICHE PER ID UTENTE BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT_BY_APPLICATION_ID', 3, false, false, 'OTTIENI MODIFICA PER ID DOMANDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT_BY_APPLICATION_ID', 5, false, false, 'OTTIENI MODIFICA PER ID DOMANDA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 3, false, false, 'ESTENDI GIORNI RISPOSTA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 5, false, false, 'ESTENDI GIORNI RISPOSTA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION_DATA_FOR_AMENDMENT', 3, false, false, 'OTTIENI DATI DOMANDA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION_DATA_FOR_AMENDMENT', 5, false, false, 'OTTIENI DATI DOMANDA PER MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_AMENDMENT', 3, false, true, 'Crea Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_AMENDMENT', 5, false, true, 'Crea Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT', 3, false, true, 'Ottieni Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT', 5, false, true, 'Ottieni Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CLOSE_AMENDMENT', 3, false, true, 'Chiudi Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CLOSE_AMENDMENT', 5, false, true, 'Chiudi Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT', 3, false, true, 'Aggiorna Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT', 5, false, true, 'Aggiorna Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_AMENDMENT', 3, false, true, 'Elimina Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_AMENDMENT', 5, false, true, 'Elimina Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT_STATUS', 3, false, true, 'Aggiorna Stato Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_AMENDMENT_STATUS', 5, false, true, 'Aggiorna Stato Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 3, false, true, 'Ottieni Tutte Le Modifiche Per ID Utente Preistruttore', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID', 5, false, true, 'Ottieni Tutte Le Modifiche Per ID Utente Preistruttore', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ALL_AMENDMENT_BY_BENEFICIARY_USER_ID', 1, false, true, 'Ottieni Tutte Le Modifiche Per ID Utente Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_BY_APPLICATION_ID', 3, false, true, 'Ottieni Modifica Per ID Domanda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_BY_APPLICATION_ID', 5, false, true, 'Ottieni Modifica Per ID Domanda', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 3, false, true, 'Estendi Giorni Risposta Per Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EXTEND_RESPONSE_DAYS_FOR_AMENDMENT', 5, false, true, 'Estendi Giorni Risposta Per Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_DATA_FOR_AMENDMENT', 3, false, true, 'Ottieni Dati Domanda Per Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_DATA_FOR_AMENDMENT', 5, false, true, 'Ottieni Dati Domanda Per Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_APPLICATION_EVALUATION', 3, false, false, 'CREA/AGGIORNA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_APPLICATION_EVALUATION', 5, false, false, 'CREA/AGGIORNA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION_EVALUATION', 3, false, false, 'OTTIENI VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_APPLICATION_EVALUATION', 5, false, false, 'OTTIENI VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_APPLICATION_EVALUATION', 3, false, false, 'ELIMINA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_APPLICATION_EVALUATION', 5, false, false, 'ELIMINA VALUTAZIONE APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), - -('CREATE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'CREA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'CREA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'ELIMINA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'ELIMINA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'OTTIENI CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'OTTIENI CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_BENEFICIARY_PREFERRED_CALL', 2, false, false, 'AGGIORNA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_BENEFICIARY_PREFERRED_CALL', 1, false, false, 'AGGIORNA CHIAMATA PREFERITA BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), - -('CREATE_ASSIGNED_APPLICATION', 2, false, false, 'CREA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_ASSIGNED_APPLICATION', 5, false, false, 'CREA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_ASSIGNED_APPLICATION', 2, false, false, 'ELIMINA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_ASSIGNED_APPLICATION', 5, false, false, 'ELIMINA APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ASSIGNED_APPLICATION', 2, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ASSIGNED_APPLICATION', 3, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_ASSIGNED_APPLICATION', 5, false, false, 'OTTIENI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_ASSIGNED_APPLICATION_DETAILS', 2, false, false, 'AGGIORNA DETTAGLI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_ASSIGNED_APPLICATION_DETAILS', 5, false, false, 'AGGIORNA DETTAGLI APPLICAZIONE ASSEGNATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), - -('CREATE_FORM_FIELD', 2, false, false, 'CREA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_FORM_FIELD', 2, false, false, 'AGGIORNA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_FORM_FIELD', 2, false, false, 'OTTIENI CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_FORM_FIELD', 2, false, false, 'ELIMINA CAMPO MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), - -('UPLOAD_CALL_DOCUMENT', 2, false, false, 'CARICA DOCUMENTO CHIAMATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_CALL_IMAGES', 2, false, false, 'CARICA IMMAGINI CHIAMATA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_APPLICATION_DOCUMENT', 1, false, false, 'CARICA DOCUMENTO APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_APPLICATION_IMAGES', 1, false, false, 'CARICA IMMAGINI APPLICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_DOCUMENT', 2, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_DOCUMENT', 1, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_DOCUMENT', 3, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_DOCUMENT', 5, false, false, 'ELIMINA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_DOCUMENT', 2, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_DOCUMENT', 1, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_DOCUMENT', 3, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_DOCUMENT', 5, false, false, 'AGGIORNA DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_IMAGES', 2, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_IMAGES', 1, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_IMAGES', 3, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_IMAGES', 5, false, false, 'AGGIORNA IMMAGINI', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DOCUMENT', 2, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DOCUMENT', 1, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DOCUMENT', 3, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DOCUMENT', 5, false, false, 'OTTIENI DOCUMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_EVALUATION', 3, false, true, 'Crea/Aggiorna Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_APPLICATION_EVALUATION', 5, false, true, 'Crea/Aggiorna Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_EVALUATION', 3, false, true, 'Ottieni Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_APPLICATION_EVALUATION', 5, false, true, 'Ottieni Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION_EVALUATION', 3, false, true, 'Elimina Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_APPLICATION_EVALUATION', 5, false, true, 'Elimina Valutazione Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_AMENDMENT_DOCUMENT', 3, false, false, 'CARICA DOCUMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_AMENDMENT_DOCUMENT', 5, false, false, 'CARICA DOCUMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_AMENDMENT_IMAGES', 3, false, false, 'CARICA IMMAGINI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_AMENDMENT_IMAGES', 5, false, false, 'CARICA IMMAGINI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_DOCUMENT', 3, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_DOCUMENT', 5, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_IMAGES', 3, false, false, 'CARICA IMMAGINI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_IMAGES', 5, false, false, 'CARICA IMMAGINI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_BENEFICIARY_PREFERRED_CALL', 2, false, true, 'Crea Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_BENEFICIARY_PREFERRED_CALL', 1, false, true, 'Crea Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_BENEFICIARY_PREFERRED_CALL', 2, false, true, 'Elimina Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_BENEFICIARY_PREFERRED_CALL', 1, false, true, 'Elimina Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_BENEFICIARY_PREFERRED_CALL', 1, false, true, 'Ottieni Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_BENEFICIARY_PREFERRED_CALL', 2, false, true, 'Ottieni Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_BENEFICIARY_PREFERRED_CALL', 2, false, true, 'Aggiorna Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_BENEFICIARY_PREFERRED_CALL', 1, false, true, 'Aggiorna Chiamata Preferita Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_UPDATE_FLOW', 2, false, false, 'CREA/AGGIORNA FLUSSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_FLOW', 2, false, false, 'OTTIENI FLUSSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_ASSIGNED_APPLICATION', 2, false, true, 'Crea Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_ASSIGNED_APPLICATION', 5, false, true, 'Crea Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_ASSIGNED_APPLICATION', 2, false, true, 'Elimina Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_ASSIGNED_APPLICATION', 5, false, true, 'Elimina Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 2, false, true, 'Ottieni Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 3, false, true, 'Ottieni Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ASSIGNED_APPLICATION', 5, false, true, 'Ottieni Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_ASSIGNED_APPLICATION_DETAILS', 2, false, true, 'Aggiorna Dettagli Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_ASSIGNED_APPLICATION_DETAILS', 5, false, true, 'Aggiorna Dettagli Applicazione Assegnata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_LOGIN_ATTEMPT_LIST', 2, false, false, 'OTTIENI LISTA TENTATIVI ACCESSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('ADD_LOGIN_ATTEMPT', 2, false, false, 'AGGIUNGI TENTATIVO ACCESSO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_FORM_FIELD', 2, false, true, 'Crea Campo Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FORM_FIELD', 2, false, true, 'Aggiorna Campo Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FORM_FIELD', 2, false, true, 'Ottieni Campo Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FORM_FIELD', 2, false, true, 'Elimina Campo Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN', 2, false, false, 'OTTENERE WIDGET CRUSCOTTO PER SUPER ADMIN', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_DASHBOARD_WIDGET_FOR_BENEFICIARY', 1, false, false, 'OTTENERE WIDGET CRUSCOTTO PER BENEFICIARIO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_CALL_DOCUMENT', 2, false, true, 'Carica Documento Chiamata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_CALL_IMAGES', 2, false, true, 'Carica Immagini Chiamata', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_APPLICATION_DOCUMENT', 1, false, true, 'Carica Documento Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_APPLICATION_IMAGES', 1, false, true, 'Carica Immagini Applicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 2, false, true, 'Elimina Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 1, false, true, 'Elimina Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 3, false, true, 'Elimina Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_DOCUMENT', 5, false, true, 'Elimina Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 2, false, true, 'Aggiorna Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 1, false, true, 'Aggiorna Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 3, false, true, 'Aggiorna Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_DOCUMENT', 5, false, true, 'Aggiorna Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 2, false, true, 'Aggiorna Immagini', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 1, false, true, 'Aggiorna Immagini', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 3, false, true, 'Aggiorna Immagini', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_IMAGES', 5, false, true, 'Aggiorna Immagini', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 2, false, true, 'Ottieni Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 1, false, true, 'Ottieni Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 3, false, true, 'Ottieni Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DOCUMENT', 5, false, true, 'Ottieni Documento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_EVALUATION_CRITERIA', 2, false, false, 'OTTENERE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_EVALUATION_CRITERIA', 2, false, false, 'AGGIORNARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_EVALUATION_CRITERIA', 2, false, false, 'ELIMINARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_EVALUATION_CRITERIA', 2, false, false, 'CREARE CRITERI DI VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_DOC', 3, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_EVALUATION_DOC', 5, false, false, 'CARICA DOCUMENTO VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_DOCUMENT', 3, false, true, 'Carica Documento Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_DOCUMENT', 5, false, true, 'Carica Documento Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_IMAGES', 3, false, true, 'Carica Immagini Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_AMENDMENT_IMAGES', 5, false, true, 'Carica Immagini Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOCUMENT', 3, false, true, 'Carica Documento Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOCUMENT', 5, false, true, 'Carica Documento Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_IMAGES', 3, false, true, 'Carica Immagini Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_IMAGES', 5, false, true, 'Carica Immagini Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_UPDATE_FLOW', 2, false, true, 'Crea/Aggiorna Flusso', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FLOW', 2, false, true, 'Ottieni Flusso', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('ADD_COMMENT_TO_AMENDMENT_REQUEST', 3, false, false, 'AGGIUNGI COMMENTO ALLA RICHIESTA DI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('ADD_COMMENT_TO_AMENDMENT_REQUEST', 5, false, false, 'AGGIUNGI COMMENTO ALLA RICHIESTA DI MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_COMMUNICATION_COMMENT', 3, false, false, 'AGGIORNARE COMMENTO COMUNICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_COMMUNICATION_COMMENT', 5, false, false, 'AGGIORNARE COMMENTO COMUNICAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT_COMMENT', 3, false, false, 'OTTENERE COMMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_AMENDMENT_COMMENT', 5, false, false, 'OTTENERE COMMENTO MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_COMMENT_FROM_AMENDMENT', 3, false, false, 'ELIMINARE COMMENTO DALLA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_COMMENT_FROM_AMENDMENT', 5, false, false, 'ELIMINARE COMMENTO DALLA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_LOGIN_ATTEMPT_LIST', 2, false, true, 'Ottieni Lista Tentativi Accesso', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('ADD_LOGIN_ATTEMPT', 2, false, true, 'Aggiungi Tentativo Accesso', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_FORM', 2, false, false, 'CREARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPDATE_FORM', 2, false, false, 'AGGIORNARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('GET_FORM', 2, false, false, 'OTTENERE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('DELETE_FORM', 2, false, false, 'ELIMINARE MODULO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN', 2, false, true, 'Ottenere Widget Cruscotto Per Super Admin', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_DASHBOARD_WIDGET_FOR_BENEFICIARY', 1, false, true, 'Ottenere Widget Cruscotto Per Beneficiario', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('AMENDMENT_EXPIRATION_SCHEDULER', 2, false, false, 'PIANIFICATORE SCADENZA MODIFICA', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('EVALUATION_EXPIRATION_SCHEDULER', 2, false, false, 'PIANIFICATORE SCADENZA VALUTAZIONE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_EVALUATION_CRITERIA', 2, false, true, 'Ottenere Criteri Di Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_EVALUATION_CRITERIA', 2, false, true, 'Aggiornare Criteri Di Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_EVALUATION_CRITERIA', 2, false, true, 'Eliminare Criteri Di Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_EVALUATION_CRITERIA', 2, false, true, 'Creare Criteri Di Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOC', 3, false, true, 'Carica Documento Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_EVALUATION_DOC', 5, false, true, 'Carica Documento Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CHECK_OR_CREATE_NDG_CODE', 2, false, false, 'VERIFICARE O CREARE CODICE NDG', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('CREATE_APPOINTMENT', 2, false, false, 'CREARE APPUNTAMENTO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), -('UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM', 2, false, false, 'CARICA DOCUMENTO NEL SISTEMA ESTERNO', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), - -('GET_USER_ACTION', 2, false, false, 'OTTENERE AZIONE UTENTE', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'); +('ADD_COMMENT_TO_AMENDMENT_REQUEST', 3, false, true, 'Aggiungi Commento Alla Richiesta Di Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('ADD_COMMENT_TO_AMENDMENT_REQUEST', 5, false, true, 'Aggiungi Commento Alla Richiesta Di Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMMUNICATION_COMMENT', 3, false, true, 'Aggiornare Commento Comunicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_COMMUNICATION_COMMENT', 5, false, true, 'Aggiornare Commento Comunicazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_COMMENT', 3, false, true, 'Ottenere Commento Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_AMENDMENT_COMMENT', 5, false, true, 'Ottenere Commento Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMMENT_FROM_AMENDMENT', 3, false, true, 'Eliminare Commento Dalla Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_COMMENT_FROM_AMENDMENT', 5, false, true, 'Eliminare Commento Dalla Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_FORM', 2, false, true, 'Creare Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPDATE_FORM', 2, false, true, 'Aggiornare Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_FORM', 2, false, true, 'Ottenere Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('DELETE_FORM', 2, false, true, 'Eliminare Modulo', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('AMENDMENT_EXPIRATION_SCHEDULER', 2, false, true, 'Pianificatore Scadenza Modifica', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('EVALUATION_EXPIRATION_SCHEDULER', 2, false, true, 'Pianificatore Scadenza Valutazione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('CHECK_OR_CREATE_NDG_CODE', 2, false, true, 'Verificare O Creare Codice NDG', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('CREATE_APPOINTMENT', 2, false, true, 'Creare Appuntamento', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM', 2, false, true, 'Carica Documento Nel Sistema Esterno', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), + +('GET_USER_ACTION', 2, false, true, 'Ottenere Azione Utente', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'), +('GET_ACTION_CONTEXT_LABELS', 2, false, true, 'Ottieni Etichette Contesto Azione', '2025-01-09T10:16:26.472Z', '2025-01-09T10:16:26.472Z'); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d0bd7669..a92a61ad 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -348,4 +348,5 @@ notification.updated.successfully=Notification updated successfully. user.with.company.not.found = User with company not found for user or company. user.action.fetched.successfully = User action details fetched successfully. +action.context.labels.fetched.successfully = Action Context Labels Fetched Successfully. amount.accepted.required=Amount accepted is required while approving the application. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index cf57021b..e7dbc010 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -340,4 +340,5 @@ notification.updated.successfully=Notifica aggiornata con successo. user.with.company.not.found = Utente con azienda non trovato per utente o azienda. user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. +action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. From 40164bd4a087e11b839ff21af17dc326c6168129 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 14 Jan 2025 18:43:25 +0530 Subject: [PATCH 03/81] Done ticket GEPAFINBE-137 --- .../constants/GepafinConstant.java | 14 ++ .../tendermanagement/dao/ApplicationDao.java | 137 +++++++++++++- .../gepafin/tendermanagement/dao/CallDao.java | 174 ++++++++++++++++-- .../tendermanagement/dao/NotificationDao.java | 125 +++++++++++++ .../enums/UserActionContextEnum.java | 8 +- .../ApplicationPageableRequestBean.java | 14 ++ .../request/CallPageableRequestBean.java | 14 ++ .../model/request/GlobalFilters.java | 18 ++ .../request/NotificationRequestBean.java | 14 ++ .../model/response/PageableResponseBean.java | 13 ++ .../tendermanagement/model/util/SortBy.java | 12 ++ .../repositories/CallRepository.java | 3 +- .../repositories/NotificationRepository.java | 9 +- .../service/ApplicationService.java | 15 +- .../tendermanagement/service/CallService.java | 6 + .../service/NotificationService.java | 5 + .../service/impl/ApplicationServiceImpl.java | 18 +- .../service/impl/CallServiceImpl.java | 10 +- .../service/impl/NotificationServiceImpl.java | 15 ++ .../gepafin/tendermanagement/util/Utils.java | 13 ++ .../web/rest/api/ApplicationApi.java | 24 ++- .../web/rest/api/CallApi.java | 18 +- .../web/rest/api/NotificationApi.java | 14 ++ .../api/impl/ApplicationApiController.java | 18 +- .../web/rest/api/impl/CallApiController.java | 18 +- .../api/impl/NotificationApiController.java | 21 +++ 26 files changed, 697 insertions(+), 53 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6cce9e90..52a2c8ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -354,5 +354,19 @@ public class GepafinConstant { public static final String NOTIFICATION_DELETED_SUCCESSFULLY="notification.deleted.successfully"; public static final String NOTIFICATION_UPDATED_SUCCESSFULLY="notification.updated.successfully"; public static final String USER_WITH_COMPANY_NOT_FOUND = "user.with.company.not.found"; + public static final String STATUS = "status"; + public static final String CALL="call"; + public static final String TITLE="title"; + public static final String MESSAGE="message"; + public static final String HUB_ID="hubId"; + public static final String ID="id"; + public static final String IS_DELETED="isDeleted"; + public static final String COMPANY_ID="companyId"; + public static final String COMMENTS="comments"; + public static final String DESCRIPTION_LONG="descriptionLong"; + public static final String DESCRIPTION_SHORT="descriptionShort"; + public static final String HUB="hub"; + public static final String NAME="name"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 0b0edf19..0c25b277 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,18 +1,16 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Root; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.*; -import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; -import net.gepafin.tendermanagement.model.request.ApplicationRequest; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.request.EmailLogRequest; -import net.gepafin.tendermanagement.model.request.NotificationReq; -import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; @@ -37,6 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -54,6 +54,8 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import static org.apache.commons.lang3.StringUtils.isEmpty; + @Component public class ApplicationDao { @@ -1349,4 +1351,127 @@ public class ApplicationDao { throw new RuntimeException("Error while creating ZIP file", e); } } + + public PageableResponseBean> getAllApplicationByPagination(UserEntity userEntity, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(callId, companyId, applicationPageableRequestBean, userEntity); + Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List applicationResponses = entityPage.getContent().stream() + .map(application -> { + ApplicationResponse response = getApplicationResponse(application); + return response; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(applicationResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId, companyId, userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (applicationPageableRequestBean.getGlobalFilters() != null + && applicationPageableRequestBean.getGlobalFilters().getSortBy() != null && + applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(ApplicationPageableRequestBean applicationPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, Long callId, Long companyId, UserEntity userEntity) { + + Integer year = null; + String search = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + year = applicationPageableRequestBean.getGlobalFilters().getYear(); + search = applicationPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + Boolean isBeneficiary = validator.checkIsBeneficiary(); + if (isBeneficiary) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); + } + if (year != null && year > 0) { + int filterYear = applicationPageableRequestBean.getGlobalFilters().getYear(); + +// Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + +// Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate titlePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.COMMENTS)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate)); + } + + // Filter by `status` (if status list is provided) + if (applicationPageableRequestBean.getStatus() != null && !applicationPageableRequestBean.getStatus().isEmpty()) { + List statusValues = applicationPageableRequestBean.getStatus().stream() + .map(ApplicationStatusTypeEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + + if (callId != null) { + CallEntity call = callService.validateCall(callId); + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.CALL).get(GepafinConstant.ID), callId)); + } + + // Optional companyId filter + if (companyId != null) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.COMPANY_ID), companyId)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); + + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 7382f1c6..0f7a9f5a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -12,14 +12,15 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.NotificationTypeEnum; -import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; -import net.gepafin.tendermanagement.model.request.NotificationReq; -import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.enums.*; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -28,6 +29,9 @@ import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -35,15 +39,6 @@ import org.springframework.util.StringUtils; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; -import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.DocumentTypeEnum; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.DocumentReq; -import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; -import net.gepafin.tendermanagement.model.request.FaqReq; -import net.gepafin.tendermanagement.model.request.LookUpDataReq; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -51,6 +46,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import static net.gepafin.tendermanagement.enums.RoleStatusEnum.ROLE_SUPER_ADMIN; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.hibernate.internal.util.collections.CollectionHelper.listOf; @Component @@ -917,4 +913,154 @@ public class CallDao { return callEntity; } + public PageableResponseBean> getAllCallsByPagination(HttpServletRequest request,UserEntity user,Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (callPageableRequestBean.getGlobalFilters() != null) { + pageNo = callPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = callPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + if (Boolean.TRUE.equals(onlyPreferredCall) && companyId == null) { + throw new CustomValidationException( + Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL) + ); + } + Specification spec = search(user, callPageableRequestBean); + Page entityPage; + if (Boolean.TRUE.equals(onlyPreferredCall)) { + validator.validateUserWithCompany(request, companyId); + UserWithCompanyEntity userWithCompanyEntity = companyService.getUserWithCompany(user.getId(), companyId); + List preferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId()); + List preferredCallIds = preferredCalls.stream() + .map(BeneficiaryPreferredCallEntity::getCallId) + .collect(Collectors.toList()); + + // Add preferredCallIds filtering to the specification + spec = spec.and((root, query, criteriaBuilder) -> + root.get(GepafinConstant.ID).in(preferredCallIds) + ); + } + entityPage = callRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + List callIds=new ArrayList<>(); + if(entityPage!=null && entityPage.getContent()!=null && Boolean.FALSE.equals(entityPage.getContent().isEmpty())) { + callIds = entityPage.getContent().stream().map(CallEntity::getId).collect(Collectors.toList()); + } + Map preferredCallsMap = + getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); + + List callDetailsResponseBeans = entityPage.getContent().stream() + .map(callEntity -> { + CallDetailsResponseBean responseBean = convertToCallDetailsResponseBean(callEntity); + String key = user.getId() + "_" + callEntity.getId(); + BeneficiaryPreferredCallEntity preferredCall = preferredCallsMap.get(key); + Long preferredId = preferredCall != null ? preferredCall.getId() : null; + responseBean.setPreferredCallId(preferredId); + + return responseBean; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(callDetailsResponseBeans); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(UserEntity userEntity, CallPageableRequestBean callPageableRequestBean) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(callPageableRequestBean, criteriaBuilder, root, userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (callPageableRequestBean.getGlobalFilters() != null + && callPageableRequestBean.getGlobalFilters().getSortBy() != null && + callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (callPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(callPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(CallPageableRequestBean callPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity) { + + Integer year = null; + String search = null; + if (callPageableRequestBean.getGlobalFilters() != null) { + year = callPageableRequestBean.getGlobalFilters().getYear(); + search = callPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + if (year != null && year > 0) { + int filterYear = callPageableRequestBean.getGlobalFilters().getYear(); + +// Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + +// Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate descriptionShort = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.DESCRIPTION_SHORT)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(descriptionShort)); + + Predicate descriptionLong = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.DESCRIPTION_LONG)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(descriptionLong)); + + Predicate name = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.NAME)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(name)); + + + } + + // Filter by `status` (if status list is provided) + if (callPageableRequestBean.getStatus() != null && !callPageableRequestBean.getStatus().isEmpty()) { + List statusValues = callPageableRequestBean.getStatus().stream() + .map(CallStatusEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); + + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 9acacdb0..3944246c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -1,5 +1,9 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -12,8 +16,12 @@ import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.enums.NotificationEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.NotificationRepository; import net.gepafin.tendermanagement.repositories.NotificationTypeRepository; import net.gepafin.tendermanagement.repositories.UserRepository; @@ -23,9 +31,16 @@ import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; @@ -34,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.hibernate.internal.util.collections.CollectionHelper.listOf; @Component @@ -275,4 +291,113 @@ public class NotificationDao { return notificationEntities.stream().map(this::convertNotificationEntityToNotificationResponse).toList(); } + + public PageableResponseBean> getAllNotification(Long userId, NotificationRequestBean notificationRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (notificationRequestBean.getGlobalFilters() != null) { + pageNo = notificationRequestBean.getGlobalFilters().getPage(); + pageLimit = notificationRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(userId, notificationRequestBean); + Page entityPage = notificationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List notificationResponses = entityPage.getContent().stream() + .map(notification -> { + NotificationResponse response = convertNotificationEntityToNotificationResponse(notification); + return response; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(notificationResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(Long userId, NotificationRequestBean notificationRequestBean) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(notificationRequestBean, criteriaBuilder, root, userId); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (notificationRequestBean.getGlobalFilters() != null + && notificationRequestBean.getGlobalFilters().getSortBy() != null && + notificationRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(notificationRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(notificationRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (notificationRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(notificationRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(NotificationRequestBean notificationRequestBean, + CriteriaBuilder criteriaBuilder, Root root, Long userId) { + + Integer year = null; + String search = null; + if (notificationRequestBean.getGlobalFilters() != null) { + year = notificationRequestBean.getGlobalFilters().getYear(); + search = notificationRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + if (year != null && year > 0) { + int filterYear = notificationRequestBean.getGlobalFilters().getYear(); + + // Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + + // Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate titlePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.TITLE)), + "%" + search.toUpperCase() + "%" + ); + Predicate messagePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.MESSAGE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate, messagePredicate)); + } + + // Filter by `status` (if status list is provided) + if (notificationRequestBean.getStatus() != null && !notificationRequestBean.getStatus().isEmpty()) { + List statusValues = notificationRequestBean.getStatus().stream() + .map(NotificationEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userId)); + return predicates; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 20f917fe..2408cb9c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -161,7 +161,13 @@ public enum UserActionContextEnum { /** appointment action context **/ CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), CREATE_APPOINTMENT("CREATE_APPOINTMENT"), - UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"); + UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), + + GET_ALL_NOTIFICATION_BY_PAGINATION("GET_ALL_NOTIFICATION_BY_PAGINATION"), + GET_ALL_CALL_BY_PAGINATION("GET_ALL_CALL_BY_PAGINATION"), + GET_ALL_APPLICATION_BY_PAGINATION("GET_ALL_APPLICATION_BY_PAGINATION"); + + private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java new file mode 100644 index 00000000..dcb2aebc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; + +import java.util.List; + +@Data +public class ApplicationPageableRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java new file mode 100644 index 00000000..8b848c85 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallStatusEnum; + +import java.util.List; + +@Data +public class CallPageableRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java b/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java new file mode 100644 index 00000000..d036a68d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.model.util.SortBy; + + +@Data +public class GlobalFilters { + private Integer year; + + private Integer page; + + private String search; + + private Integer limit; + + private SortBy sortBy; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java new file mode 100644 index 00000000..6e8c0389 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.NotificationEnum; + +import java.util.List; + +@Data +public class NotificationRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java new file mode 100644 index 00000000..f4b92929 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class PageableResponseBean { + + private T body; + private Long totalRecords; + private int currentPage; + private int totalPages; + private int pageSize; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java b/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java new file mode 100644 index 00000000..5e4032a6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.util; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class SortBy { + + String columnName; + Boolean sortDesc; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 833e1d68..dc53bad7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -9,7 +10,7 @@ import java.math.BigDecimal; import java.util.List; @Repository -public interface CallRepository extends JpaRepository { +public interface CallRepository extends JpaRepository, JpaSpecificationExecutor { // public CallEntity findByIdAndStatusNotIn(Long id, List status); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java index bce3ba68..254547f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java @@ -1,12 +1,18 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.NotificationEntity; +import org.apache.poi.ss.formula.functions.T; import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; -public interface NotificationRepository extends JpaRepository { +public interface NotificationRepository extends JpaRepository , JpaSpecificationExecutor { NotificationEntity findByIdAndIsDeletedFalse(Long id); @@ -17,4 +23,5 @@ public interface NotificationRepository extends JpaRepository findByUserIdAndIsDeletedFalseAndStatusIn(Long userId, List statuses); List findByUserWithCompanyIdAndUserIdAndIsDeletedFalse(Long userWithCompanyId, Long userId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 3ab94ae2..24935ca9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -2,18 +2,17 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import java.util.List; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; public interface ApplicationService { @@ -41,5 +40,9 @@ public interface ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId); public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId); + byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId); -} + + PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 8762d576..b12a3398 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -5,11 +5,13 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; public interface CallService { @@ -30,5 +32,9 @@ public interface CallService { CallEntity validateCall(Long callId); CallEntity validatePublishedCall(Long callId, Long hubId); + byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId); + + PageableResponseBean> getAllCallsByPagination(HttpServletRequest request, Long companyId , Boolean onlyPreferredCall,CallPageableRequestBean callPageableRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java index ca5927c0..940d753e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java @@ -2,8 +2,12 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +import org.springframework.data.domain.Page; import java.util.List; @@ -20,4 +24,5 @@ public interface NotificationService { public List getNotificationsByCompanyIdAndUserId(Long userId, Long companyId, List statuses); + PageableResponseBean> getAllNotification(HttpServletRequest request,Long userId, NotificationRequestBean notificationRequestBean); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 6a3d827b..c5d937a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -8,15 +8,12 @@ import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -128,5 +125,14 @@ public class ApplicationServiceImpl implements ApplicationService { public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { return applicationDao.downloadApplicationDocumentsAsZip(request,applicationId); } - + + @Override + public PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + UserEntity userEntity = validator.validateUser(request); + if (companyId != null) { + validator.validateUserWithCompany(request, companyId); + } + return applicationDao.getAllApplicationByPagination(userEntity,callId,companyId,applicationPageableRequestBean); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 38fd9562..07823f1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -5,11 +5,13 @@ import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Validator; @@ -102,5 +104,11 @@ public class CallServiceImpl implements CallService { validator.validateUserWithCall(user, callId); return callDao.downloadCallDocumentsAsZip(callId); } - + + @Override + public PageableResponseBean> getAllCallsByPagination(HttpServletRequest request,Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + UserEntity user = validator.validateUser(request); + return callDao.getAllCallsByPagination(request,user,companyId,onlyPreferredCall,callPageableRequestBean); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java index 86eaa5cf..bb9f167d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java @@ -3,11 +3,17 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.dao.NotificationDao; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.service.NotificationService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import java.util.List; @@ -21,6 +27,9 @@ public class NotificationServiceImpl implements NotificationService { @Autowired private NotificationDao notificationDao; + @Autowired + private Validator validator; + @Override public NotificationResponse sendNotification(Long userId, NotificationReq notificationReq, Long companyId) { @@ -59,4 +68,10 @@ public class NotificationServiceImpl implements NotificationService { public List getNotificationsByCompanyIdAndUserId(Long userId, Long companyId, List statuses) { return notificationDao.getNotificationByCompanyIdAndUserId(userId, companyId, statuses); } + + @Override + public PageableResponseBean> getAllNotification(HttpServletRequest request, Long userId, NotificationRequestBean notificationRequestBean) { + UserEntity userEntity = validator.validateUser(request); + return notificationDao.getAllNotification(userId,notificationRequestBean); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index b126e6dd..e1df59bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -25,6 +25,7 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -690,4 +691,16 @@ public class Utils { public static String createChannelForUserAndCompany(Long userId, Long companyId) { return GepafinConstant.COMMON_SINGLE_CHANNEL_PREFIX + userId + GepafinConstant.COMPANY_PREFIX + companyId; } + public static GlobalFilters setPageNumberAndLimit(GlobalFilters globalFilters){ + if (globalFilters == null) { + if (globalFilters.getLimit() == null || globalFilters.getLimit() <= 0) { + globalFilters.setLimit(GepafinConstant.DEFAULT_PAGE_LIMIT); + } + + if (globalFilters.getPage() == null || globalFilters.getPage() <= 0) { + globalFilters.setPage(GepafinConstant.DEFAULT_PAGE); + } + } + return globalFilters; + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index d72f4daf..6b98b3f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -2,6 +2,9 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; +import net.gepafin.tendermanagement.model.response.*; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -19,12 +22,6 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -59,7 +56,7 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}", produces = "application/json") ResponseEntity> getApplicationByFormId(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId,@Parameter(description = "The form id", required = false) @RequestParam(value = "formId",required = false) Long formId); - @Operation(summary = "Api to get all applications", + @Operation(summary = "Api to get all applications (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -213,5 +210,18 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}/documents/zip") ResponseEntity downloadApplicationDocumentsAsZip(HttpServletRequest httpServletRequest, @Parameter(required = true) @PathVariable("applicationId") Long applicationId); + + + @Operation(summary = "Api to get all application by pagination.", 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))) }) + @PostMapping( value = "/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllApplicationByPagination(HttpServletRequest request,@Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, @RequestBody ApplicationPageableRequestBean applicationPageableRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 5a7d0384..e14ed8e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -3,6 +3,9 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -89,7 +92,7 @@ public interface CallApi { @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId,@RequestParam(value = "companyId", required = false) Long companyId); - @Operation(summary = "Api to get all calls", + @Operation(summary = "Api to get all calls (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -149,4 +152,17 @@ public interface CallApi { ResponseEntity downloadCallDocumentsAsZip(HttpServletRequest httpServletRequest, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + @Operation(summary = "Api to get all calls by pagination.", 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))) }) + @PostMapping(value = "/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllCallsByPagination(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall, @RequestBody CallPageableRequestBean callPageableRequestBean); + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java index ca059499..44bc0e84 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java @@ -7,10 +7,14 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.domain.Page; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -96,6 +100,16 @@ public interface NotificationApi { @Parameter(description = "The company ID", required = true) @PathVariable(value = "companyId") Long companyId, @Parameter(description = "The notification status", required = false) @RequestParam(value = "status", required = false) List statuses); + @Operation(summary = "Api to get all notification by pagination.", 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))) }) + @PostMapping(value = "/user/{userId}/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllNotification(HttpServletRequest request,@Parameter(description = "The user id", required = true) @PathVariable(value = "userId") Long userId, @RequestBody NotificationRequestBean notificationRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 3223dda7..ccf386c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -5,16 +5,13 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.PdfService; @@ -229,4 +226,15 @@ public class ApplicationApiController implements ApplicationApi { return new ResponseEntity<>(zipFile, headers, HttpStatus.OK); } + @Override + public ResponseEntity>>> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + + /** This code is responsible for creating user action logs for the "get all notification by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_APPLICATION_BY_PAGINATION).build()); + + PageableResponseBean> pageableResponseBean=applicationService + .getAllApplicationByPagination(request, callId,companyId,applicationPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(pageableResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 18d2657f..85de9a1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -5,7 +5,8 @@ import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; -import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.util.LoggingUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; @@ -14,14 +15,12 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.util.Response; @@ -151,5 +150,16 @@ public class CallApiController implements CallApi { return new ResponseEntity<>(zipFile, headers, HttpStatus.OK); } + @Override + public ResponseEntity>>> getAllCallsByPagination(HttpServletRequest request, Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + + /** This code is responsible for creating user action logs for the "get all call by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_CALL_BY_PAGINATION).build()); + + PageableResponseBean> callsByPagination=callService.getAllCallsByPagination(request,companyId,onlyPreferredCall,callPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(callsByPagination, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + } + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java index d2047d7a..549b6517 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java @@ -4,13 +4,21 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; +import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.NotificationService; +import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.web.rest.api.NotificationApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,6 +33,9 @@ public class NotificationApiController implements NotificationApi { @Autowired private NotificationService notificationService; + @Autowired + LoggingUtil loggingUtil; + public ResponseEntity> sendNotification(HttpServletRequest request, NotificationReq notificationReq, Long userId, Long companyId) { NotificationResponse notificationData = notificationService.sendNotification(userId, notificationReq, companyId); @@ -71,4 +82,14 @@ public class NotificationApiController implements NotificationApi { .body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); } + @Override + public ResponseEntity>>> getAllNotification(HttpServletRequest request,Long userId, NotificationRequestBean notificationRequestBean) { + + /** This code is responsible for creating user action logs for the "get all notification by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_NOTIFICATION_BY_PAGINATION).build()); + + PageableResponseBean> notificationResponses=notificationService.getAllNotification(request, userId,notificationRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); + } + } \ No newline at end of file From 4e09ff212eb5b01cdeb3079ab45ef563bfb21223 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 15 Jan 2025 11:22:18 +0530 Subject: [PATCH 04/81] Display column totals for formula-enabled in PDF --- .../constants/GepafinConstant.java | 5 + .../gepafin/tendermanagement/dao/PdfDao.java | 101 +++++++++++++----- 2 files changed, 78 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5869fc81..ce63cb94 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -360,5 +360,10 @@ public class GepafinConstant { public static final String STATUS_CODE_STRING = "statusCode"; public static final String GET_STATUS_CODE_STRING = "status"; public static final String MESSAGE_STRING = "message"; + + public static final String SUM="sum"; + public static final String MULTIPLY="multiply"; + public static final String NUMERIC="numeric"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index a2e437cd..28be65b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -10,6 +10,7 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; @@ -29,6 +30,8 @@ import org.springframework.stereotype.Component; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.text.NumberFormat; +import java.text.ParseException; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -258,10 +261,11 @@ public class PdfDao { // Create a PdfPTable with dynamic column count based on stateFieldMap size Map stateFieldMap = new HashMap<>(); Map stateFieldBoolean = new HashMap<>(); -// Font textFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(178, 190, 181)); // Gray text + Map formulaEnabledMap = new HashMap<>(); + Map formulaTypeMap = new HashMap<>(); + Map fieldTypeMap = new HashMap<>(); - // Populate stateFieldMap from contentResponseBean settings - contentResponseBean.getSettings().stream() + contentResponseBean.getSettings().stream() .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" .map(SettingResponseBean::getValue) .filter(Objects::nonNull) // Ensure value is not null @@ -273,28 +277,27 @@ public class PdfDao { .forEach(fieldData -> { String fieldName = (String) fieldData.get("name"); // Get the name field String fieldDataValue = (String) fieldData.get("label"); // Get the predefined field + Boolean predefined = (Boolean) fieldData.get("predefined"); // Get the predefined field + Boolean isFormulaEnabled = (Boolean) fieldData.get("enableFormula"); + String formulaType = (String) fieldData.get("lastRowFormula"); + String fieldType = (String) fieldData.get("fieldtype"); // Get the field type (e.g., numeric) if (fieldName != null && fieldDataValue != null) { stateFieldMap.put(fieldName, fieldDataValue); } - }); - contentResponseBean.getSettings().stream() - .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" - .map(SettingResponseBean::getValue) - .filter(Objects::nonNull) // Ensure value is not null - .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map - .map(settingValue -> (Map) settingValue) // Cast to Map - .map(valueMap -> (List>) valueMap.get("stateFieldData")) // Extract stateFieldData list - .filter(Objects::nonNull) // Ensure stateFieldData is not null - .flatMap(List::stream) // Flatten the list of field data maps - .forEach(fieldData -> { - String fieldName = (String) fieldData.get("name"); // Get the name field - Boolean predefined = (Boolean) fieldData.get("predefined"); // Get the predefined field - if (fieldName != null && fieldName != null) { + if (fieldName != null && predefined != null) { stateFieldBoolean.put(fieldName, predefined); } + formulaEnabledMap.put(fieldName, isFormulaEnabled != null && isFormulaEnabled); + if (formulaType != null) { + formulaTypeMap.put(fieldName, formulaType); + } + if (fieldType != null) { + fieldTypeMap.put(fieldName, fieldType); // Store the fieldType in the map + } }); - PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries + + PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries table.setWidthPercentage(100); // Set table width to 100% table.setTableEvent(new RoundedBorderEvent()); @@ -314,12 +317,9 @@ public class PdfDao { } List orderedKeys = new ArrayList<>(trueKeys); orderedKeys.addAll(falseKeys); - // Iterate through extracted data to populate the table - // Add headers once - if (!headersAdded) { + if (!headersAdded) { for (String key : orderedKeys) { String headerValue = stateFieldMap.get(key); // Header text -// PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header PdfPCell headerCell = PdfUtils.htmlToPdfPCell(headerValue, textFont); headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); @@ -332,18 +332,20 @@ public class PdfDao { } headersAdded = true; // Prevent headers from being added again } + Map columnSums = new HashMap<>(); - // Add data rows matching stateFieldMap keys for (Map row : extractedData) { - // Add data rows matching stateFieldMap keys for (String key : orderedKeys) { if (stateFieldMap.containsKey(key)) { // Only add data cell if key is in stateFieldMap Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present String fieldValue= (String) value; - if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } -// PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); + if (Boolean.TRUE.equals(formulaEnabledMap.get(key)) && Boolean.TRUE.equals(GepafinConstant.NUMERIC.equalsIgnoreCase(fieldTypeMap.get(key)))) { + calculateValue(key, fieldValue, formulaTypeMap, columnSums); + } + PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell dataCell.setMinimumHeight(30f); @@ -356,23 +358,66 @@ public class PdfDao { } } - // Check if adding another row would exceed max height if (table.getTotalHeight() + rowHeight > maxTableHeight) { document.add(table); // Add the table to the document document.newPage(); // Start a new page table = new PdfPTable(stateFieldMap.size()); // Create a new table for the new page table.setWidthPercentage(100); // Reset table width - headersAdded = false; // Reset the header flag for the new page } } + + for (String key : orderedKeys) { + if (Boolean.TRUE.equals(formulaEnabledMap.get(key)) && + (GepafinConstant.SUM.equalsIgnoreCase(formulaTypeMap.get(key)) || + GepafinConstant.MULTIPLY.equalsIgnoreCase(formulaTypeMap.get(key)))) { + + if (columnSums.containsKey(key)) { + double total = columnSums.getOrDefault(key, 0.0); // Get the total for the column + PdfPCell sumCell = PdfUtils.htmlToPdfPCell(Utils.convertToItalianFormat(String.valueOf(total)), textFont); + sumCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for totals + sumCell.setHorizontalAlignment(Element.ALIGN_CENTER); + sumCell.setMinimumHeight(30f); + table.addCell(sumCell); // Add total for the column + } else { + PdfPCell emptyCell = new PdfPCell(new Phrase("")); + emptyCell.setBackgroundColor(new BaseColor(239, 243, 248)); + table.addCell(emptyCell); + } + } else { + PdfPCell emptyCell = new PdfPCell(new Phrase("")); + emptyCell.setBackgroundColor(new BaseColor(239, 243, 248)); + table.addCell(emptyCell); + } + + } + + // Add the last table to the document document.add(table); return document; } + private static void calculateValue(String key, String fieldValue, Map formulaTypeMap, Map columnSums) { + try { + if (Boolean.FALSE.equals(StringUtils.isEmpty(fieldValue))) { + // Use Locale.ITALY to parse the number with the Italian format (comma as decimal separator) + NumberFormat format = NumberFormat.getInstance(Locale.ITALY); + Number number = format.parse(fieldValue); // Parse the fieldValue as a number + double numericValue = number.doubleValue(); // Convert the parsed number to double + + if (GepafinConstant.SUM.equalsIgnoreCase(formulaTypeMap.get(key))) { + columnSums.merge(key, numericValue, Double::sum); + } else if (GepafinConstant.MULTIPLY.equalsIgnoreCase(formulaTypeMap.get(key))) { + columnSums.merge(key, numericValue, (existing, newValue) -> existing == null ? newValue : existing * newValue); + } + } + } catch (ParseException e) { + } + } + public static class RoundedBorderEvent implements PdfPTableEvent { @Override public void tableLayout(PdfPTable table, float[][] widths, float[] heights, From 3644aa0292497103974c913d0a4a7ab1190bd048 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 15 Jan 2025 12:18:46 +0530 Subject: [PATCH 05/81] Updated code --- .../net/gepafin/tendermanagement/constants/GepafinConstant.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8cf8f499..f2ba75af 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -376,7 +376,6 @@ public class GepafinConstant { public static final String AMOUNT_ACCEPTED_REQUIRED_WHILE_APPROVING_APPLICATION="amount.accepted.required"; public static final String CALL_NAME="callName"; public static final String NUMBER_OF_APPLICATIONS="numberOfApplications"; - public static final String STATUS="status"; public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; From 04359cea40dc566ef04abf4f4fe798a6ae713b87 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 15 Jan 2025 15:01:07 +0530 Subject: [PATCH 06/81] Fixed evaluation issue --- .../gepafin/tendermanagement/dao/ApplicationEvaluationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7cced04a..8c89b510 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -618,7 +618,7 @@ public class ApplicationEvaluationDao { entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); - if(Boolean.TRUE.equals(req.getApplicationStatus().equals(ApplicationStatusForEvaluation.APPROVED)) && (req.getAmountAccepted()==null || req.getAmountAccepted().compareTo(BigDecimal.ZERO) < 0)){ + if(req.getApplicationStatus()!=null && (Boolean.TRUE.equals(req.getApplicationStatus().equals(ApplicationStatusForEvaluation.APPROVED)) && (req.getAmountAccepted()==null || req.getAmountAccepted().compareTo(BigDecimal.ZERO) < 0))){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.AMOUNT_ACCEPTED_REQUIRED_WHILE_APPROVING_APPLICATION)); } if (req.getAmountAccepted() != null && req.getAmountAccepted().compareTo(BigDecimal.ZERO) > 0) { From f14cf4a3802bd18700cbe1dec19014441bb11ef5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 15 Jan 2025 15:11:29 +0530 Subject: [PATCH 07/81] Updated code --- .../tendermanagement/dao/CompanyDao.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 1b3a6798..b014b779 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -143,17 +143,20 @@ public class CompanyDao { entity.setNumberOfEmployees(request.getNumberOfEmployees()); entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setHub(userEntity.getHub()); - Map vatCheckResponse = request.getVatCheckResponse(); if (request.getVatCheckResponse() != null) { - if (vatCheckResponse.containsKey("dettaglio")) { - Map dettaglio = (Map) vatCheckResponse.get("dettaglio"); - if (dettaglio != null) { - if (dettaglio.containsKey("codice_ateco")) { - Object codiceAtecoObj = dettaglio.get("codice_ateco"); - String codiceAteco = (codiceAtecoObj != null) ? codiceAtecoObj.toString() : null; + Map vatCheckResponse = request.getVatCheckResponse(); + Map data = (Map) vatCheckResponse.get("data"); + if (data != null) { + if (data.containsKey("dettaglio")) { + Map dettaglio = (Map) data.get("dettaglio"); + if (dettaglio != null) { + if (dettaglio.containsKey("codice_ateco")) { + Object codiceAtecoObj = dettaglio.get("codice_ateco"); + String codiceAteco = (codiceAtecoObj != null) ? codiceAtecoObj.toString() : null; - if (codiceAteco != null) { - entity.setCodiceAteco(codiceAteco); + if (codiceAteco != null) { + entity.setCodiceAteco(codiceAteco); + } } } } From 727fa506dc8b85eeb112deb32ef31b81f8e98fc6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 15 Jan 2025 18:03:27 +0530 Subject: [PATCH 08/81] Changes related to the response of the Dashboard Widget for Super Admin API. --- .../tendermanagement/constants/GepafinConstant.java | 4 ++-- .../net/gepafin/tendermanagement/dao/DashboardDao.java | 3 ++- .../repositories/ApplicationRepository.java | 10 +++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 95515759..e95c04f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -377,11 +377,11 @@ public class GepafinConstant { public static final String MESSAGE_STRING = "message"; public static final String AMOUNT_ACCEPTED_REQUIRED_WHILE_APPROVING_APPLICATION="amount.accepted.required"; public static final String CALL_NAME="callName"; - public static final String NUMBER_OF_APPLICATIONS="numberOfApplications"; + public static final String NUMBER_OF_APPLICATIONS="numberOfSubmitedApplications"; + public static final String NUMBER_OF_DRAFT_APPLICATIONS="numberOfDraftApplications"; public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; - } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 8f3a55f1..589d7a67 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -179,7 +179,8 @@ public class DashboardDao { stats.put(GepafinConstant.APPLICATION_PER_CALL, applicationsPerCall.stream().map(result -> { Map callData = new HashMap<>(); callData.put(GepafinConstant.CALL_NAME, result[0]); // Call name - callData.put(GepafinConstant.NUMBER_OF_APPLICATIONS, result[1]); // Application count + callData.put(GepafinConstant.NUMBER_OF_APPLICATIONS, result[1]);// Application count + callData.put(GepafinConstant.NUMBER_OF_DRAFT_APPLICATIONS, result[2]);// Application count return callData; }).toList()); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index c46c52c7..5bac8a89 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -45,9 +45,17 @@ public interface ApplicationRepository extends JpaRepository findApplicationsPerCallWithName(@Param("hubId") Long hubId); + + // Count Applications by Status by Hub ID @Query("SELECT a.status, COUNT(a.id) FROM ApplicationEntity a WHERE a.isDeleted = false AND a.call.hub.id = :hubId GROUP BY a.status") List findApplicationsByStatus(@Param("hubId") Long hubId); From 1b6a11a7710093845b6a22d0635957d613bd848a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 15 Jan 2025 19:49:09 +0530 Subject: [PATCH 09/81] Updated JPA query of dashboard --- .../repositories/ApplicationRepository.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 5bac8a89..086b0807 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -45,17 +45,25 @@ public interface ApplicationRepository extends JpaRepository findApplicationsPerCallWithName(@Param("hubId") Long hubId); + @Query(value = "SELECT c.name AS callName, " + "SUM(CASE WHEN a.status IN ('DISCARD', 'SOCCORSO', 'APPROVED', 'REJECTED', 'EVALUATION', 'APPOINTMENT', 'NDG', 'ADMISSIBLE', 'SUBMIT') THEN 1 ELSE 0 END) AS totalApplications, " + "SUM(CASE WHEN a.status IN ('DRAFT', 'AWAITING', 'READY') THEN 1 ELSE 0 END) AS draftApplications " + - "FROM application a " + - "JOIN call c ON a.call_id = c.id " + - "WHERE a.is_deleted = false AND c.hub_id = :hubId " + - "GROUP BY c.name", nativeQuery = true) + "FROM ApplicationEntity a " + + "JOIN a.call c " + + "WHERE a.isDeleted = false AND c.hub.id = :hubId " + + "GROUP BY c.name") List findApplicationsPerCallWithName(@Param("hubId") Long hubId); - // Count Applications by Status by Hub ID @Query("SELECT a.status, COUNT(a.id) FROM ApplicationEntity a WHERE a.isDeleted = false AND a.call.hub.id = :hubId GROUP BY a.status") List findApplicationsByStatus(@Param("hubId") Long hubId); From 70a3098fae6d5df21302355955d6cbe97aa6b25a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 15 Jan 2025 21:09:54 +0530 Subject: [PATCH 10/81] Updated color code in pdf --- .../net/gepafin/tendermanagement/dao/PdfDao.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 28be65b9..ec7b53da 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -264,8 +264,10 @@ public class PdfDao { Map formulaEnabledMap = new HashMap<>(); Map formulaTypeMap = new HashMap<>(); Map fieldTypeMap = new HashMap<>(); + Font lightGrayFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(110, 110, 110)); // Light gray - contentResponseBean.getSettings().stream() + + contentResponseBean.getSettings().stream() .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" .map(SettingResponseBean::getValue) .filter(Objects::nonNull) // Ensure value is not null @@ -375,9 +377,17 @@ public class PdfDao { if (columnSums.containsKey(key)) { double total = columnSums.getOrDefault(key, 0.0); // Get the total for the column - PdfPCell sumCell = PdfUtils.htmlToPdfPCell(Utils.convertToItalianFormat(String.valueOf(total)), textFont); +// PdfPCell sumCell = PdfUtils.htmlToPdfPCell(Utils.convertToItalianFormat(String.valueOf(total)), textFont); + // Convert total to Italian format, defaulting to "0" if null + String formattedTotal = Utils.convertToItalianFormat(String.valueOf(total)); + + // Create a table cell with the formatted value + PdfPCell sumCell = new PdfPCell(new Phrase(formattedTotal,lightGrayFont)); + + sumCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for totals sumCell.setHorizontalAlignment(Element.ALIGN_CENTER); + sumCell.setPaddingTop(8f); sumCell.setMinimumHeight(30f); table.addCell(sumCell); // Add total for the column } else { From 4cb4d784037d3418a8799dc4a8a0dc4b620e0537 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 16 Jan 2025 13:20:23 +0530 Subject: [PATCH 11/81] Saml redirect url issue --- .../gepafin/tendermanagement/config/SamlFailureHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index 52b30dbd..bdbd0801 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -58,14 +58,16 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { feBaseUrl = hub.getDomainName(); } } - response.sendRedirect(feBaseUrl + "/login"); + String redirectUrl = feBaseUrl + "/login"; + response.sendRedirect(redirectUrl); + logger.info("SAML redirect Url: " + redirectUrl); } catch (Exception e) { logger.error("Error processing SAML failure handler", e); } } public static String extractInResponseTo(String message) { - String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-]+)\\]"; + String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-_]+)\\]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(message); From ca5d93ae1cb18f68047cb5ee7911e9834b433140 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 17 Jan 2025 14:31:38 +0530 Subject: [PATCH 12/81] Applied check for call end date and time --- .../constants/GepafinConstant.java | 2 +- .../tendermanagement/dao/ApplicationDao.java | 28 ++++++++++++++++--- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index dd163bf1..5ed3ad63 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -386,6 +386,6 @@ public class GepafinConstant { public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; - + public static final String CALL_END_DATE_PASSED="call.end.date.passed"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index b7602621..1cf56505 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -49,7 +49,9 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.text.MessageFormat; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; @@ -872,7 +874,7 @@ public class ApplicationDao { ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) { CallEntity call = callService.validateCall(callId); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId()); - + checkCallEndDate(call); // call = callService.validatePublishedCall(call.getId()); // checkIfApplicationExists(call, userWithCompanyEntity, userEntity); ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity); @@ -890,7 +892,7 @@ public class ApplicationDao { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { ApplicationEntity applicationEntity = validateApplication(applicationId); - + checkCallEndDate(applicationEntity.getCall()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); @@ -1119,7 +1121,7 @@ public class ApplicationDao { public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file) { ApplicationEntity applicationEntity = validateApplication(applicationId); - + checkCallEndDate(applicationEntity.getCall()); //cloned entity for old data ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(applicationEntity); @@ -1252,7 +1254,8 @@ public class ApplicationDao { ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); - + checkCallEndDate(applicationEntity.getCall()); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { @@ -1516,4 +1519,21 @@ public class ApplicationDao { return predicates; } + public void checkCallEndDate(CallEntity call) { + LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); + + LocalDateTime callEndDateTime = LocalDateTime.of( + call.getEndDate().toLocalDate(), + call.getEndTime() + ); + + if (now.isAfter(callEndDateTime)) { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.CALL_END_DATE_PASSED) + ); + } + } + + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index a92a61ad..1cd051ce 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -350,3 +350,4 @@ user.with.company.not.found = User with company not found for user or company. user.action.fetched.successfully = User action details fetched successfully. action.context.labels.fetched.successfully = Action Context Labels Fetched Successfully. amount.accepted.required=Amount accepted is required while approving the application. +call.end.date.passed=Call end date and time has been passed. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index e7dbc010..733152e7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -304,7 +304,6 @@ beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione. company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero. -application.cannot.approved.or.rejected=La domanda non puďż˝ essere approvata o rifiutata perchďż˝ l'emendamento ďż˝ attivo. valid.vatnumber.message=Il numero di partita IVA ďż˝ valido. application.cannot.approved.or.rejected=La domanda non pu? essere approvata o rifiutata perch? l'emendamento ? attivo. @@ -342,3 +341,4 @@ user.with.company.not.found = Utente con azienda non trovato per utente o aziend user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. +call.end.date.passed=La data e l'ora di fine della chiamata sono state trascorse. \ No newline at end of file From 378d91f9e6d2442b837e06e0e7e4447ea4874e14 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 17 Jan 2025 15:14:22 +0530 Subject: [PATCH 13/81] Changes in response for end date and time --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 2 +- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 +++- .../java/net/gepafin/tendermanagement/dao/FlowFormDao.java | 2 ++ .../tendermanagement/model/response/ApplicationResponse.java | 3 +++ .../model/response/NextOrPreviousFormResponse.java | 5 +++++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 2 +- 7 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5ed3ad63..34a05ca6 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -386,6 +386,6 @@ public class GepafinConstant { public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; - public static final String CALL_END_DATE_PASSED="call.end.date.passed"; + public static final String CALL_EXPIRED="call.expired"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 1cf56505..ba847ca3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -188,6 +188,7 @@ public class ApplicationDao { // callService.validatePublishedCall(formEntity.getCall().getId()); validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); + checkCallEndDate(applicationEntity.getCall()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); @@ -407,6 +408,7 @@ public class ApplicationDao { responseBean.setProgress(progress); responseBean.setCallTitle(applicationEntity.getCall().getName()); responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); + responseBean.setCallEndTime(applicationEntity.getCall().getEndTime()); responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); @@ -1530,7 +1532,7 @@ public class ApplicationDao { if (now.isAfter(callEndDateTime)) { throw new CustomValidationException( Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.CALL_END_DATE_PASSED) + Translator.toLocale(GepafinConstant.CALL_EXPIRED) ); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index faec3489..bf68f3b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -296,6 +296,8 @@ public class FlowFormDao { applicationDao.processForm(formEntity, applicationEntity)); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); + nextOrPreviousFormResponse.setCallEndDate(applicationEntity.getCall().getEndDate()); + nextOrPreviousFormResponse.setCallEndTime(applicationEntity.getCall().getEndTime()); nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompanyId()); nextOrPreviousFormResponse.setCompanyName(company.getCompanyName()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java index 1aae69e2..2c659838 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseB import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; @Data @@ -18,6 +19,8 @@ public class ApplicationResponse{ private LocalDateTime callEndDate; + private LocalTime callEndTime; + private LocalDateTime modifiedDate; private Integer progress; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index bea417a1..6bed05fc 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.LocalTime; @Data public class NextOrPreviousFormResponse { @@ -20,6 +21,10 @@ public class NextOrPreviousFormResponse { private Long completedSteps; private Long currentStep; + + private LocalDateTime callEndDate; + + private LocalTime callEndTime; private Long companyId; diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 1cd051ce..4559736c 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -350,4 +350,4 @@ user.with.company.not.found = User with company not found for user or company. user.action.fetched.successfully = User action details fetched successfully. action.context.labels.fetched.successfully = Action Context Labels Fetched Successfully. amount.accepted.required=Amount accepted is required while approving the application. -call.end.date.passed=Call end date and time has been passed. +call.expired=Call has been expired. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 733152e7..1ab08cbd 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -341,4 +341,4 @@ user.with.company.not.found = Utente con azienda non trovato per utente o aziend user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. -call.end.date.passed=La data e l'ora di fine della chiamata sono state trascorse. \ No newline at end of file +call.expired=La chiamata č scaduta. \ No newline at end of file From 664040f2f907975c19cbc8179160b294c2e239ff Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 20 Jan 2025 12:17:35 +0530 Subject: [PATCH 14/81] Fixed error while moving file to deleted folder --- .../service/impl/AmazonS3ServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index 8221117a..9909f732 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -153,11 +153,17 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } } + private String decodeS3Key(String key) { + return URLDecoder.decode(key, StandardCharsets.UTF_8); + } + @Override public UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath) { try { + log.info("Original Paths - oldPath: {}, newPath: {}", oldPath, newPath); + + oldPath = decodeS3Key(cleanOldPath(oldPath)); newPath = cleanNewPath(oldPath, newPath); - oldPath = cleanOldPath(oldPath); log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName); CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath); From f4f084719fdcbf9b9fb60e324a86f456ce1326ea Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 20 Jan 2025 18:09:29 +0530 Subject: [PATCH 15/81] Applied table validation --- .../constants/GepafinConstant.java | 3 +- .../gepafin/tendermanagement/dao/FormDao.java | 30 +++--- .../tendermanagement/util/FieldValidator.java | 93 ++++++++++++++++++- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 5 files changed, 109 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index dd163bf1..e9cc9eae 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -386,6 +386,7 @@ public class GepafinConstant { public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; - + public static final String NON_EMPTY_TABLES="nonEmptyTables"; + public static final String VALIDATION_IN_TABLE = "validation.table.message"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 9e85a843..2ff4b2e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -55,13 +55,13 @@ public class FormDao { @Autowired private CallRepository callRepository; - + @Autowired private Validator validator; @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; - + @Autowired private EvaluationCriteriaService evaluationCriteriaService; @@ -144,7 +144,7 @@ public class FormDao { validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent()); return convertFormEntityToFormResponseBean(formEntity); } - + private void validateAndSaveCriteriaFormField(CallEntity callEntity, FormEntity formEntity, List contentResponseBeans) { @@ -211,7 +211,7 @@ public class FormDao { /** This code is responsible for adding a version history log for the "creating criteria form field" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(criteriaFormField).build()); - + } public void validateForm(FormRequest formRequest){ @@ -397,9 +397,9 @@ public class FormDao { FieldValidator validator = FieldValidator.create(); formResponseBean.getContent().forEach(contentResponseBean -> { String fieldId = contentResponseBean.getId(); - String value = (String) formFieldMap.get(fieldId); String fieldLabel=contentResponseBean.getLabel(); - + Object object=formFieldMap.get(fieldId); + String value =Utils.convertToString(object); if(value == null && isApplicationFormExist) { return; } @@ -408,7 +408,7 @@ public class FormDao { .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel) // Only applies if minLength is not null .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel) // Only applies if maxLength is not null .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present - .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel); // Add the custom validation here + .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldLabel); if(error != null) { @@ -428,11 +428,14 @@ public class FormDao { for (Object value : list) { setFormFieldMap(fieldId, formFieldMap, value); } - } + }else if (list.stream().allMatch(item -> item instanceof Map map && + map.keySet().stream().allMatch(String.class::isInstance))) { + if (fieldValue != null) { + formFieldMap.put(fieldId, fieldValue); + } + } else setFormFieldMap(fieldId, formFieldMap, fieldValue); } - else setFormFieldMap(fieldId, formFieldMap, fieldValue); } - private void setFormFieldMap(String fieldId, Map formFieldMap, Object value) { if (value instanceof String) { if(value !=null && Boolean.FALSE.equals(StringUtils.isEmpty((String)value))) { @@ -453,7 +456,7 @@ public class FormDao { for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) { formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue()); } - + FormResponseBean formResponseBean = convertFormEntityToFormResponseBean(formEntity); FieldValidator validator = FieldValidator.create(); formResponseBean.getContent().forEach(contentResponseBean -> { @@ -462,10 +465,11 @@ public class FormDao { FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); validator - .isRequired(value,fieldValidatorBean.getIsRequired(),fieldId); + .isRequired(value,fieldValidatorBean.getIsRequired(),contentResponseBean.getLabel()); }); + validator.validate(); if (validator.hasErrors()) { - return false; // Validation failed, return false + return false; } return true; } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 26edffff..9fb108ae 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -1,17 +1,20 @@ package net.gepafin.tendermanagement.util; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.FormDao; import net.gepafin.tendermanagement.dao.VatCheckDao; +import net.gepafin.tendermanagement.model.request.ContentRequestBean; +import net.gepafin.tendermanagement.model.response.ContentResponseBean; +import net.gepafin.tendermanagement.model.response.SettingResponseBean; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.ValidationException; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -75,7 +78,7 @@ public class FieldValidator { return value == null || value == 0L; } - public FieldValidator validateCustom(String value, String customRule, String fieldId) { + public FieldValidator validateCustom(String value, String customRule, String fieldId, ContentResponseBean contentResponseBean) { if (customRule == null || value == null) { return this; // No custom rule to validate } @@ -131,6 +134,10 @@ public class FieldValidator { } break; + case GepafinConstant.NON_EMPTY_TABLES: + checkTableValidation(value, fieldId, contentResponseBean, errors); + break; + default: // If the custom rule is unknown, just log or add an error (optional) errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_CUSTOM), fieldId, customRule)); @@ -139,6 +146,70 @@ public class FieldValidator { return this; } + + private static void checkTableValidation(String value, String fieldId, ContentResponseBean contentResponseBean, List errors) { + Map stateFieldMap= new HashMap<>(); + + contentResponseBean.getSettings().stream() + .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .map(SettingResponseBean::getValue) + .filter(Objects::nonNull) // Ensure value is not null + .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map + .map(settingValue -> (Map) settingValue) // Cast to Map + .map(valueMap -> (List>) valueMap.get("stateFieldData")) // Extract stateFieldData list + .filter(Objects::nonNull) // Ensure stateFieldData is not null + .flatMap(List::stream) // Flatten the list of field data maps + .forEach(fieldData -> { + String fieldName = (String) fieldData.get("name"); // Get the name field + Boolean isPredefined = (Boolean) fieldData.get("predefined"); // Get the predefined field + + if (fieldName != null && isPredefined != null) { + stateFieldMap.put(fieldName, isPredefined); + } + }); + + + try { + List> fieldValueList = Utils.convertJsonStringIntoJsonList(value); + + if (fieldValueList == null || fieldValueList.isEmpty()) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), + fieldId)); + return; + } + + for (int rowIndex = 0; rowIndex < fieldValueList.size(); rowIndex++) { + Map field = fieldValueList.get(rowIndex); + + boolean hasSingleNonNullPredefinedFalse = false; + + for (Map.Entry entry : stateFieldMap.entrySet()) { + String stateKey = entry.getKey(); + Boolean isPredefinedFalse = Boolean.FALSE.equals(entry.getValue()); + + if (isPredefinedFalse) { + Object fieldValue = field.get(stateKey); + if (fieldValue != null && !StringUtils.isEmpty(fieldValue.toString())) { + hasSingleNonNullPredefinedFalse = true; + break; + } + } + } + + if (!hasSingleNonNullPredefinedFalse) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), + fieldId)); + break; + } + + } + + } catch (Exception e) { + } + } + public FieldValidator isRequired(String value,Boolean isRequired, String fieldName) { if (Boolean.TRUE.equals(isRequired)) { // Only check if isRequired is true if (Objects.isNull(value) || value.isEmpty()) { // Check if value is null or empty @@ -150,4 +221,16 @@ public class FieldValidator { public boolean hasErrors() { return !errors.isEmpty(); } + + + public ContentRequestBean getContentRequestBeanFromJson(String jsonString) throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + + // Parse the JSON into a ContentRequestBean + ContentRequestBean contentRequestBean = objectMapper.readValue(jsonString, ContentRequestBean.class); + + // Now contentRequestBean is populated with the data from the JSON + return contentRequestBean; + } + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index a92a61ad..1066eaaa 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -61,6 +61,7 @@ invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or status.cannot.be.changed=Status cannot be changed. published.call.not.update=Published call cannot be updated. invalid.status.change.from.publish=Status cannot be changed to READY_TO_PUBLISH or DRAFT from PUBLISH. +validation.table.message=Data for field {0} is not present. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index e7dbc010..ca782fe6 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -342,3 +342,4 @@ user.with.company.not.found = Utente con azienda non trovato per utente o aziend user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. +validation.table.message=I dati per il campo {0} non sono presenti. \ No newline at end of file From 05828eac9966e82e8c817f66a5d4ac145b9d8bc7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 20 Jan 2025 20:32:21 +0530 Subject: [PATCH 16/81] Done Changes related to evaluation expiration days --- .../dao/ApplicationEvaluationDao.java | 11 ++++++++++- .../tendermanagement/entities/HubEntity.java | 3 +++ .../db/changelog/db.changelog-1.0.0.xml | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 8c89b510..48573e4f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -113,12 +113,21 @@ public class ApplicationEvaluationDao { @Autowired private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + @Autowired + private HubService hubService; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); AssignedApplicationsEntity assignedApplications = assignedApplicationsService.validateAssignedApplication(assignedApplciationId); ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); + + Long hubId = application.getHubId(); + HubEntity hub = hubService.valdateHub(hubId); + + Long initialDays = (hub != null) ? hub.getEvaluationExpirationDays() : 0L; + entity.setApplicationId(application.getId()); entity.setAssignedApplicationsEntity(assignedApplications); entity.setUserId(user.getId()); @@ -128,7 +137,7 @@ public class ApplicationEvaluationDao { entity.setNote(req.getNote()); entity.setMotivation(req.getMotivation()); entity.setIsDeleted(false); - entity.setInitialDays(30L); + entity.setInitialDays(initialDays); entity.setRemainingDays(30L); entity.setSuspendedDays(0L); entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 52aa6cc2..ccd6c325 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -63,4 +63,7 @@ public class HubEntity extends BaseEntity{ @Column(name = "AREA_CODE") private String areaCode; + + @Column(name = "EVALUATION_EXPIRATION_DAYS") + private Long evaluationExpirationDays; } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d8c7dbea..349633de 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2229,4 +2229,23 @@ + + + + + + + + + + + unique_uuid = 't7jh5wfg9QXylNaTZkPoE' + + + + + unique_uuid = 'p4lk3bcx1RStqTaIVVbXs' + + + From e1f1ffd69e9937827aa5689392a4ca4df1e98f30 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 21 Jan 2025 14:21:57 +0530 Subject: [PATCH 17/81] Done ticket GEPAFINBE-141 --- .../dao/ApplicationAmendmentRequestDao.java | 2 +- .../tendermanagement/dao/DashboardDao.java | 105 +++++++++++++++++- .../ApplicationAmendmentRequestEntity.java | 3 + .../enums/UserActionContextEnum.java | 1 + .../response/AmendmentWidgetResponseBean.java | 22 ++++ ...ApplicationAmendmentRequestRepository.java | 52 +++++++++ .../AssignedApplicationsRepository.java | 3 + .../service/DashboardService.java | 2 + .../service/impl/DashboardServiceImpl.java | 6 + .../web/rest/api/DashboardApi.java | 15 ++- .../rest/api/impl/DashboardApiController.java | 11 ++ .../db/changelog/db.changelog-1.0.0.xml | 7 ++ 12 files changed, 223 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentWidgetResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 2cf5d3ca..5693193c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -990,7 +990,7 @@ public class ApplicationAmendmentRequestDao { } setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote()); setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); - + existingApplicationAmendment.setClosingDate(LocalDateTime.now()); ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment, oldApplicationAmendmentEntity, VersionActionTypeEnum.UPDATE); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment,false); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 8f3a55f1..53309e9d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -6,15 +6,14 @@ import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.Widget1; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -22,6 +21,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -58,6 +59,13 @@ public class DashboardDao { @Autowired private UserActionsRepository userActionsRepository; + @Autowired + private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private Validator validator; public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) { SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); @@ -263,6 +271,95 @@ public class DashboardDao { responseBean.setNumberOfDueApplication(dueApplications); } } + private AmendmentWidgetResponseBean initializeAmendmentResponseBean() { + return AmendmentWidgetResponseBean.builder() + .totalAmendments(0L) + .waitingForResponseAmendments(0L) + .responseReceivedAmendments(0L) + .averageResponseDays(BigDecimal.ZERO) + .expiringRequestsIn48Hours(0L) + .expiredAmendments(0L) + .build(); + } + + public AmendmentWidgetResponseBean getAmendmentDetails(UserEntity userEntity) { + AmendmentWidgetResponseBean amendmentWidgetResponseBean = initializeAmendmentResponseBean(); + + Long hubId = userEntity.getHub().getId(); + List applicationIds = getApplicationIdsForUserOrHub(userEntity,hubId); + setAmendmentCounts(applicationIds,amendmentWidgetResponseBean, hubId); + calculateExpiringRequestsIn48Hours(applicationIds,amendmentWidgetResponseBean, hubId); + calculateAverageResponseDays(applicationIds,amendmentWidgetResponseBean,hubId); + return amendmentWidgetResponseBean; + } + public List getApplicationIdsForUserOrHub(UserEntity userEntity, Long hubId) { + if (validator.checkIsPreInstructor()) { + return assignedApplicationsRepository.findApplicationIdsByUserIdAndIsDeletedFalse(userEntity.getId()); + } else { + return applicationRepository.findApplicationIdsByHubId(hubId); + } + } + + private void setAmendmentCounts(List applicationIds,AmendmentWidgetResponseBean responseBean, Long hubId) { + + Long totalAmendment = applicationAmendmentRequestRepository.countAmendmentsByApplicationIds(applicationIds); + if (totalAmendment != null) { + responseBean.setTotalAmendments(totalAmendment); + } + + Long awaitingAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.AWAITING.getValue()); + if (awaitingAmendments != null) { + responseBean.setWaitingForResponseAmendments(awaitingAmendments); + } + Long responseRecievedAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + if (responseRecievedAmendments != null) { + responseBean.setResponseReceivedAmendments(responseRecievedAmendments); + } + Long expiredAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.EXPIRED.getValue()); + if (expiredAmendments != null) { + responseBean.setExpiredAmendments(expiredAmendments); + } + } + + private void calculateExpiringRequestsIn48Hours(List applicationIds ,AmendmentWidgetResponseBean responseBean, Long hubId) { + + // Define the statuses to filter + List statuses = List.of( + ApplicationAmendmentRequestEnum.AWAITING.getValue(), + ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue() + ); + + LocalDateTime twoDaysLater = LocalDateTime.now().plusDays(2); + + Long expiringRequestsIn48Hours = applicationAmendmentRequestRepository.countExpiringRequestsIn48Hours( + applicationIds, + statuses, + LocalDateTime.now(), + twoDaysLater + ); + + if (expiringRequestsIn48Hours != null) { + responseBean.setExpiringRequestsIn48Hours(expiringRequestsIn48Hours); + } + } + + private void calculateAverageResponseDays(List applicationIds ,AmendmentWidgetResponseBean responseBean, Long hubId) { + + if (!applicationIds.isEmpty()) { + BigDecimal averageResponseDays = applicationAmendmentRequestRepository + .findAverageResponseDaysByApplicationIdsAndStatus( + applicationIds, + ApplicationAmendmentRequestEnum.CLOSE.getValue() + ); + + responseBean.setAverageResponseDays(averageResponseDays); + } else { + responseBean.setAverageResponseDays(BigDecimal.ZERO); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index 8a8701a1..840ad050 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -53,4 +53,7 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "amendment_document") private String amendmentDocument; + + @Column(name = "CLOSING_DATE") + private LocalDateTime closingDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 5cae2da0..64fd530c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -137,6 +137,7 @@ public enum UserActionContextEnum { GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN("GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN"), GET_DASHBOARD_WIDGET_FOR_BENEFICIARY("GET_DASHBOARD_WIDGET_FOR_BENEFICIARY"), GET_APPLICATION_DETAILS("GET_APPLICATION_DETAILS"), + GET_AMENDMENT_DETAILS("GET_AMENDMENT_DETAILS"), /** Evaluation criteria action context **/ GET_EVALUATION_CRITERIA("GET_EVALUATION_CRITERIA"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentWidgetResponseBean.java new file mode 100644 index 00000000..365ecbf0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentWidgetResponseBean.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +@Builder +@Data +public class AmendmentWidgetResponseBean { + + private Long totalAmendments; + + private Long waitingForResponseAmendments; + + private Long responseReceivedAmendments; + + private BigDecimal averageResponseDays; + + private Long expiringRequestsIn48Hours; + + private Long expiredAmendments; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 3c89993c..89bd8098 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -9,6 +9,8 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -80,4 +82,54 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findExpiringBetween(LocalDateTime startTime, LocalDateTime endTime); + + + @Query("SELECT COUNT(a) FROM ApplicationAmendmentRequestEntity a WHERE a.applicationId IN :applicationIds AND a.isDeleted = false") + Long countAmendmentsByApplicationIds(@Param("applicationIds") List applicationIds); + + @Query("SELECT COUNT(a) FROM ApplicationAmendmentRequestEntity a WHERE a.applicationId IN :applicationIds AND a.status = :status AND a.isDeleted = false") + Long countAmendmentsByApplicationIdsAndStatus(@Param("applicationIds") List applicationIds, @Param("status") String status); + + @Query(""" + SELECT e + FROM ApplicationAmendmentRequestEntity e + WHERE e.applicationId IN :applicationIds + AND e.status IN :statuses + AND e.isDeleted = false + """) + List findAllByApplicationIdsAndStatuses( + @Param("applicationIds") List applicationIds, + @Param("statuses") List statuses + ); + List findAllByApplicationIdInAndStatusAndIsDeletedFalse(List applicationIds, String status); + + @Query(""" + SELECT COALESCE(AVG(TIMESTAMPDIFF(DAY, a.startDate, a.closingDate)), 0) + FROM ApplicationAmendmentRequestEntity a + WHERE a.applicationId IN :applicationIds + AND a.status = :status + AND a.isDeleted = false + AND a.closingDate IS NOT NULL +""") + BigDecimal findAverageResponseDaysByApplicationIdsAndStatus( + @Param("applicationIds") List applicationIds, + @Param("status") String status + ); + + + @Query(value = """ + SELECT COUNT(*) + FROM application_amendment_request e + WHERE e.application_id IN :applicationIds + AND e.status IN :statuses + AND e.start_date + INTERVAL '1 DAY' * e.response_days <= :endDate + AND e.start_date + INTERVAL '1 DAY' * e.response_days >= :startDate + AND e.is_deleted = false +""", nativeQuery = true) + Long countExpiringRequestsIn48Hours( + @Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate + ); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index dac54c98..56036759 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -22,4 +22,7 @@ public interface AssignedApplicationsRepository extends JpaRepository 'CLOSE'") Long countAssignedApplicationsByUserId(@Param("userId") Long userId); + + @Query("SELECT aa.application.id FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false AND aa.userId = :userId") + List findApplicationIdsByUserIdAndIsDeletedFalse(@Param("userId") Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java index 0e34c1b6..ee7429d4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; @@ -11,4 +12,5 @@ public interface DashboardService { public BeneficiaryWidgetResponseBean getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId); public ApplicationWidgetResponseBean getApplicationDetails(HttpServletRequest request); + public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index e578a3dc..e157d293 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DashboardDao; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; @@ -39,4 +40,9 @@ public class DashboardServiceImpl implements DashboardService { UserEntity userEntity=validator.validateUser(request); return dashboardDao.getApplicationDetails(userEntity); } + @Override + public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request) { + UserEntity userEntity=validator.validateUser(request); + return dashboardDao.getAmendmentDetails(userEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java index 31ae1be3..bf1779fc 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; @@ -61,5 +62,17 @@ public interface DashboardApi { produces = { "application/json" }) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')") ResponseEntity> getApplicationDetails(HttpServletRequest request); - + @Operation(summary = "Api to get Soccorso details", + 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 = "/amendment", + produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") + ResponseEntity> getAmendmentDetails(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java index ed1f3d68..c9bc0d85 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; @@ -60,4 +61,14 @@ public class DashboardApiController implements DashboardApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } + @Override + public ResponseEntity> getAmendmentDetails(HttpServletRequest request) { + + /** This code is responsible for creating user action logs for the "Get dashboard widget for amendment page" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_AMENDMENT_DETAILS).build()); + + AmendmentWidgetResponseBean widgetResponseBean= dashboardService.getAmendmentDetails(request); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d8c7dbea..bf3fd60b 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2229,4 +2229,11 @@ + + + + + + + From 31ce02e726078640b8ab39f3024a017935381b24 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 21 Jan 2025 17:01:47 +0530 Subject: [PATCH 18/81] updated native query --- .../repositories/ApplicationAmendmentRequestRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 89bd8098..3e25f4a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -119,7 +119,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository Date: Tue, 21 Jan 2025 22:39:55 +0530 Subject: [PATCH 19/81] Fixed isRequested amount issue --- .../tendermanagement/dao/ApplicationDao.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index ba847ca3..d9938639 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -497,27 +497,24 @@ public class ApplicationDao { VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); - contentResponseBeans.stream() - .filter(content -> "numberinput".equals(content.getName())) - .map(ContentResponseBean::getSettings) - .flatMap(List::stream) - .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) - .findFirst() - .ifPresent(setting -> { - Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); - if(fieldValue!=null) { - if (fieldValue instanceof String) { - try { - BigDecimal amountRequested = new BigDecimal((String) fieldValue); - applicationFormEntity.getApplication().setAmountRequested(amountRequested); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); - } - } else { - throw new IllegalArgumentException("Field value is not a String: " + fieldValue); - } - } - }); + contentResponseBeans.stream() + .filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) + .map(ContentResponseBean::getSettings) + .flatMap(List::stream) + .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) + .findFirst() + .ifPresent(setting -> { + + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); + if(fieldValue!=null) { + try { + BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); + applicationFormEntity.getApplication().setAmountRequested(amountRequested); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); + } + } + }); ApplicationFormFieldEntity oldApplicationFormFieldData = null; From b31c33103d1f779a8ebe85fbf2fb0109cca67bfa Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 16:38:46 +0530 Subject: [PATCH 20/81] Added validation for the requested amount in the application. --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 1 + .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 34a05ca6..faf9570e 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -387,5 +387,6 @@ public class GepafinConstant { public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; public static final String CALL_EXPIRED="call.expired"; + public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d9938639..84131b9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1260,6 +1260,9 @@ public class ApplicationDao { if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); } + if (applicationEntity.getAmountRequested() == null || applicationEntity.getAmountRequested().compareTo(BigDecimal.ZERO) <= 0 ) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO)); + } List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalSteps = flowFormDao.calculateTotalSteps(flowEdgesList); Integer completedSteps = flowFormDao.getCompletedSteps(applicationEntity); From c8580317bac566cb7e80164e0c0a2735219c41f3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 16:39:10 +0530 Subject: [PATCH 21/81] updated code --- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 4559736c..4839b210 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -351,3 +351,4 @@ user.action.fetched.successfully = User action details fetched successfully. action.context.labels.fetched.successfully = Action Context Labels Fetched Successfully. amount.accepted.required=Amount accepted is required while approving the application. call.expired=Call has been expired. +amount.request.should.greated.then.zero=Requested amount should not be empty and should be greater than zero. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 1ab08cbd..65fa7094 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -341,4 +341,5 @@ user.with.company.not.found = Utente con azienda non trovato per utente o aziend user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. -call.expired=La chiamata č scaduta. \ No newline at end of file +call.expired=La chiamata č scaduta. +amount.request.should.greated.then.zero=L'importo richiesto non deve essere vuoto e deve essere maggiore di zero. From 4957a91f41a1217a7598d593562f017b4f914798 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 22 Jan 2025 18:04:00 +0530 Subject: [PATCH 22/81] Fixed validation error issue in nex-prev api. --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 ++-- .../net/gepafin/tendermanagement/dao/FlowFormDao.java | 8 ++++---- .../java/net/gepafin/tendermanagement/dao/FormDao.java | 7 +++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d9938639..b9c9d5a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -402,7 +402,7 @@ public class ApplicationDao { ApplicationResponse responseBean = new ApplicationResponse(); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList); - Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity)); + Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity, false)); Integer progress = calculateProgress(totalFormSteps, completedSteps); responseBean.setId(applicationEntity.getId()); responseBean.setProgress(progress); @@ -1262,7 +1262,7 @@ public class ApplicationDao { } List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalSteps = flowFormDao.calculateTotalSteps(flowEdgesList); - Integer completedSteps = flowFormDao.getCompletedSteps(applicationEntity); + Integer completedSteps = flowFormDao.getCompletedSteps(applicationEntity, true); if (totalSteps.intValue() != completedSteps) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index bf68f3b9..404ec854 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -305,7 +305,7 @@ public class FlowFormDao { Long totalFormSteps = calculateTotalSteps(flowEdgesList); Long currentStep = calculateCurrentStep(flowEdgesList, formEntity); nextOrPreviousFormResponse.setTotalFormSteps(totalFormSteps); - completedSteps = getCompletedSteps(applicationEntity); + completedSteps = getCompletedSteps(applicationEntity, false); nextOrPreviousFormResponse.setCompletedSteps(Long.valueOf(completedSteps)); nextOrPreviousFormResponse.setCurrentStep(currentStep); if(applicationEntity.getProtocol() != null) { @@ -318,13 +318,13 @@ public class FlowFormDao { return nextOrPreviousFormResponse; } - public Integer getCompletedSteps(ApplicationEntity applicationEntity) { + public Integer getCompletedSteps(ApplicationEntity applicationEntity, Boolean isSendValidationError) { Integer completedSteps=0; List applicationFormList = applicationFormRepository.findByApplicationId(applicationEntity.getId()); List applicationFormFieldEntities=new ArrayList<>(); for (ApplicationFormEntity applicationFormEntity:applicationFormList){ applicationFormFieldEntities=applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); - Boolean isCompleted=formDao.validateCompletedSteps(applicationFormFieldEntities, applicationEntity, applicationFormEntity.getForm()); + Boolean isCompleted=formDao.validateCompletedSteps(applicationFormFieldEntities, applicationEntity, applicationFormEntity.getForm(), isSendValidationError); if(Boolean.TRUE.equals(isCompleted)){ completedSteps++; } @@ -361,7 +361,7 @@ public class FlowFormDao { FormEntity currentFormEntity = applicationFormList.get(applicationFormList.size() - 1).getForm(); for (ApplicationFormEntity applicationFormEntity : applicationFormList) { - Boolean isCompleted = formDao.validateCompletedSteps(applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()), applicationEntity, applicationFormEntity.getForm()); + Boolean isCompleted = formDao.validateCompletedSteps(applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()), applicationEntity, applicationFormEntity.getForm(), false); if (Boolean.FALSE.equals(isCompleted)) { return applicationFormEntity.getForm().getId(); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 2ff4b2e9..3b910738 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -451,7 +451,8 @@ public class FormDao { return false; } - public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity) { + public Boolean validateCompletedSteps(List applicationFormFieldEntityList, ApplicationEntity applicationEntity, FormEntity formEntity, + Boolean isSendValidationError) { Map formFieldMap = new LinkedHashMap(); for(ApplicationFormFieldEntity applicationFormFieldEntity:applicationFormFieldEntityList) { formFieldMap.put(applicationFormFieldEntity.getFieldId(),applicationFormFieldEntity.getFieldValue()); @@ -467,7 +468,9 @@ public class FormDao { validator .isRequired(value,fieldValidatorBean.getIsRequired(),contentResponseBean.getLabel()); }); - validator.validate(); + if (Boolean.TRUE.equals(isSendValidationError)) { + validator.validate(); + } if (validator.hasErrors()) { return false; } From 20c148128e57a72bd6560d7102b437056391f053 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 18:04:46 +0530 Subject: [PATCH 23/81] Fixed motivation field issue --- .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 88e6954a..3988b35a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -265,7 +265,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getNote()); + bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation()); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,null); } From 45aaf4f66706d4ab9cbf99d478219f5317bfd885 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 23 Jan 2025 13:16:11 +0530 Subject: [PATCH 24/81] Fixed vaidation errors for createupdate application API. --- .../gepafin/tendermanagement/dao/FormDao.java | 2 +- .../gepafin/tendermanagement/util/Utils.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 3b910738..b9b4da07 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -399,7 +399,7 @@ public class FormDao { String fieldId = contentResponseBean.getId(); String fieldLabel=contentResponseBean.getLabel(); Object object=formFieldMap.get(fieldId); - String value =Utils.convertToString(object); + String value =Utils.convertToStringForFormFieldValue(object); if(value == null && isApplicationFormExist) { return; } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 18c49a6e..2f063173 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -407,6 +407,29 @@ public class Utils { return input.toString(); } + public static String convertToStringForFormFieldValue(Object input) { + if (input == null) { + return null; // Return string "null" for null input + } + + if (input instanceof String) { + return (String) input; // Return the string directly if input is a string + } + + if (input instanceof Collection) { + // Handle collections (List, Set, etc.) + return convertCollectionToString((Collection) input); + } + + if (input instanceof Map) { + // Handle maps + return convertMapToString((Map) input); + } + + // For other types (like Integer, Boolean, etc.), use toString() + return input.toString(); + } + private static String convertCollectionToString(Collection collection) { try { return mapper.writeValueAsString(collection); // Convert the collection to a JSON string From 2c01cbc39a4d791b5da6b74e39f978244ed2b759 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 23 Jan 2025 14:11:58 +0530 Subject: [PATCH 25/81] Done ticket GEPAFINBE-144 --- .../tendermanagement/dao/DashboardDao.java | 75 +++++++++++++++---- .../enums/UserActionContextEnum.java | 1 + ...AssignedApplicationWidgetResponseBean.java | 15 ++++ .../ApplicationEvaluationRepository.java | 4 +- .../AssignedApplicationsRepository.java | 40 ++++++++++ .../service/DashboardService.java | 3 + .../service/impl/DashboardServiceImpl.java | 7 ++ .../web/rest/api/DashboardApi.java | 16 ++++ .../rest/api/impl/DashboardApiController.java | 14 ++++ 9 files changed, 158 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 1f17ef3e..4dbca0cf 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -6,31 +6,23 @@ import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; -import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; -import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.*; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.List; -import java.util.List; + import java.util.stream.Collectors; @Component @@ -57,8 +49,6 @@ public class DashboardDao { @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; - @Autowired - private UserActionsRepository userActionsRepository; @Autowired private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; @@ -258,14 +248,15 @@ public class DashboardDao { if (Boolean.FALSE.equals(applicationIds.isEmpty())) { BigDecimal averageTime = applicationEvaluationRepository.findAverageEvaluationTimeByApplicationIds(applicationIds); - responseBean.setEvaluationAverageTime(averageTime != null ? averageTime : BigDecimal.ZERO); + responseBean.setEvaluationAverageTime(averageTime != null ? averageTime.setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO); } LocalDate twoDaysLater = LocalDate.now().plusDays(2); - + List statusList =Arrays.asList( ApplicationEvaluationStatusTypeEnum.OPEN.getValue(), ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); Long dueApplications = applicationEvaluationRepository.countDueApplicationsBetween( applicationIds, LocalDate.now(), - twoDaysLater + twoDaysLater, + statusList ); if (dueApplications != null) { @@ -362,5 +353,57 @@ public class DashboardDao { } } + public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(UserEntity userEntity) { + Long userId = userEntity.getId(); + Long hubId = userEntity.getHub().getId(); + + Object[] results; + List applicationIds; + if (validator.checkIsPreInstructor()) { + results = assignedApplicationsRepository.countAssignedApplicationsWithStatus(userId, hubId); + applicationIds = assignedApplicationsRepository.findApplicationIdsByUserIdAndHubIdAndIsDeletedFalse(userId,hubId); + } else { + results = assignedApplicationsRepository.countAssignedApplicationsForHub(hubId); + applicationIds = assignedApplicationsRepository.findApplicationIdsByHubId(hubId); + } + AssignedApplicationWidgetResponseBean response = convertToResponse(results); + calculateEvaluationAvgTimeForAssignedApplication(response, applicationIds); + return response; + } + + private void calculateEvaluationAvgTimeForAssignedApplication(AssignedApplicationWidgetResponseBean response, List applicationIds) { + if (applicationIds == null || applicationIds.isEmpty()) { + response.setEvaluationAverageTime(BigDecimal.ZERO); + response.setNumberOfApplicationExpiringIn48Hours(0L); + return; + } + + BigDecimal averageTime = applicationEvaluationRepository.findAverageEvaluationTimeByApplicationIds(applicationIds); + response.setEvaluationAverageTime(averageTime != null ? averageTime.setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO); + + LocalDate today = LocalDate.now(); + LocalDate twoDaysLater = today.plusDays(2); + List statusList =Arrays.asList( ApplicationEvaluationStatusTypeEnum.OPEN.getValue(), ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); + Long dueApplications = applicationEvaluationRepository.countDueApplicationsBetween( + applicationIds, today, twoDaysLater,statusList + ); + response.setNumberOfApplicationExpiringIn48Hours(dueApplications != null ? dueApplications : 0L); + } + + private AssignedApplicationWidgetResponseBean convertToResponse(Object[] results) { + AssignedApplicationWidgetResponseBean response = new AssignedApplicationWidgetResponseBean(); + + Object[] data = (Object[]) results[0]; + + response.setNumberOfAssignedApplication(data[0] instanceof Number ? ((Number) data[0]).longValue() : 0L); + response.setNumberOfApplicationInAmendmentState(data[1] instanceof Number ? ((Number) data[1]).longValue() : 0L); + response.setNumberOfApplicationInEvaluationState(data[2] instanceof Number ? ((Number) data[2]).longValue() : 0L); + response.setNumberOfAcceptedApplication(data[3] instanceof Number ? ((Number) data[3]).longValue() : 0L); + + return response; + } + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 64fd530c..503f0383 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -138,6 +138,7 @@ public enum UserActionContextEnum { GET_DASHBOARD_WIDGET_FOR_BENEFICIARY("GET_DASHBOARD_WIDGET_FOR_BENEFICIARY"), GET_APPLICATION_DETAILS("GET_APPLICATION_DETAILS"), GET_AMENDMENT_DETAILS("GET_AMENDMENT_DETAILS"), + GET_APPLICATION_DETAILS_FOR_EVALUATION("GET_APPLICATION_DETAILS_FOR_EVALUATION"), /** Evaluation criteria action context **/ GET_EVALUATION_CRITERIA("GET_EVALUATION_CRITERIA"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java new file mode 100644 index 00000000..163acdad --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AssignedApplicationWidgetResponseBean { + private Long numberOfAssignedApplication; + private Long numberOfApplicationInAmendmentState; + private Long numberOfAcceptedApplication; + private Long numberOfApplicationInEvaluationState; + private Long numberOfApplicationExpiringIn48Hours; + private BigDecimal evaluationAverageTime; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index cf0b9c66..468a5a6f 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -55,11 +55,13 @@ public interface ApplicationEvaluationRepository extends JpaRepository applicationIds, @Param("startDate") LocalDate startDate, - @Param("endDate") LocalDate endDate + @Param("endDate") LocalDate endDate, + @Param("statusList") List statusList ); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 56036759..16fa4928 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -25,4 +25,44 @@ public interface AssignedApplicationsRepository extends JpaRepository findApplicationIdsByUserIdAndIsDeletedFalse(@Param("userId") Long userId); + + @Query(""" + SELECT + COALESCE(COUNT(a.id), 0) AS totalAssigned, + COALESCE(SUM(CASE WHEN app.status = 'SOCCORSO' THEN 1 ELSE 0 END), 0) AS amendmentCount, + COALESCE(SUM(CASE WHEN app.status = 'EVALUATION' THEN 1 ELSE 0 END), 0) AS evaluationCount, + COALESCE(SUM(CASE WHEN app.status = 'APPROVED' THEN 1 ELSE 0 END), 0) AS approvedCount + FROM AssignedApplicationsEntity a + JOIN a.application app + WHERE a.isDeleted = false + AND a.userId = :userId + AND app.hubId = :hubId +""") + Object[] countAssignedApplicationsWithStatus( + @Param("userId") Long userId, + @Param("hubId") Long hubId + ); + + @Query(""" + SELECT + COALESCE(COUNT(a.id), 0) AS totalAssigned, + COALESCE(SUM(CASE WHEN app.status = 'SOCCORSO' THEN 1 ELSE 0 END), 0) AS amendmentCount, + COALESCE(SUM(CASE WHEN app.status = 'EVALUATION' THEN 1 ELSE 0 END), 0) AS evaluationCount, + COALESCE(SUM(CASE WHEN app.status = 'APPROVED' THEN 1 ELSE 0 END), 0) AS approvedCount + FROM AssignedApplicationsEntity a + JOIN a.application app + WHERE a.isDeleted = false + AND app.hubId = :hubId +""") + Object[] countAssignedApplicationsForHub(@Param("hubId") Long hubId); + + @Query("SELECT aa.application.id FROM AssignedApplicationsEntity aa " + + "WHERE aa.userId = :userId AND aa.application.hubId = :hubId AND aa.isDeleted = false") + List findApplicationIdsByUserIdAndHubIdAndIsDeletedFalse(@Param("userId") Long userId, @Param("hubId") Long hubId); + + @Query("SELECT aa.application.id FROM AssignedApplicationsEntity aa " + + "WHERE aa.application.hubId = :hubId AND aa.isDeleted = false") + List findApplicationIdsByHubId(@Param("hubId") Long hubId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java index ee7429d4..f2076f0c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; @@ -13,4 +14,6 @@ public interface DashboardService { public BeneficiaryWidgetResponseBean getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId); public ApplicationWidgetResponseBean getApplicationDetails(HttpServletRequest request); public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request); + public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index e157d293..a3cf0482 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; import net.gepafin.tendermanagement.service.DashboardService; @@ -45,4 +46,10 @@ public class DashboardServiceImpl implements DashboardService { UserEntity userEntity=validator.validateUser(request); return dashboardDao.getAmendmentDetails(userEntity); } + + @Override + public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request) { + UserEntity userEntity = validator.validateUser(request); + return dashboardDao.getApplicationDetailsForEvaluation(userEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java index bf1779fc..2fe77d1b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -75,4 +76,19 @@ public interface DashboardApi { produces = { "application/json" }) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") ResponseEntity> getAmendmentDetails(HttpServletRequest request); + + @Operation(summary = "Api to get Application details for Evaluation", + 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 = "/evaluation", + produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") + ResponseEntity> getApplicationDetailsForEvaluation(HttpServletRequest request); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java index c9bc0d85..7a4a489c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; import net.gepafin.tendermanagement.model.util.Response; @@ -71,4 +72,17 @@ public class DashboardApiController implements DashboardApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } + + @Override + public ResponseEntity> getApplicationDetailsForEvaluation(HttpServletRequest request) { + + /** This code is responsible for creating user action logs for the "Get Application Details for Evaluation" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION_DETAILS_FOR_EVALUATION).build()); + + AssignedApplicationWidgetResponseBean widgetResponseBean= dashboardService.getApplicationDetailsForEvaluation(request); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); + } + + } From 3e8b55c90ed51cf4f2a28ae98509d9fd2d2dcf85 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 23 Jan 2025 16:06:37 +0530 Subject: [PATCH 26/81] updated code --- .../java/net/gepafin/tendermanagement/dao/DashboardDao.java | 4 ++-- .../model/response/AssignedApplicationWidgetResponseBean.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 4dbca0cf..1d0bc307 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -373,13 +373,13 @@ public class DashboardDao { private void calculateEvaluationAvgTimeForAssignedApplication(AssignedApplicationWidgetResponseBean response, List applicationIds) { if (applicationIds == null || applicationIds.isEmpty()) { - response.setEvaluationAverageTime(BigDecimal.ZERO); + response.setAverageEvaluationDays(BigDecimal.ZERO); response.setNumberOfApplicationExpiringIn48Hours(0L); return; } BigDecimal averageTime = applicationEvaluationRepository.findAverageEvaluationTimeByApplicationIds(applicationIds); - response.setEvaluationAverageTime(averageTime != null ? averageTime.setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO); + response.setAverageEvaluationDays(averageTime != null ? averageTime.setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO); LocalDate today = LocalDate.now(); LocalDate twoDaysLater = today.plusDays(2); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java index 163acdad..186ff323 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java @@ -11,5 +11,5 @@ public class AssignedApplicationWidgetResponseBean { private Long numberOfAcceptedApplication; private Long numberOfApplicationInEvaluationState; private Long numberOfApplicationExpiringIn48Hours; - private BigDecimal evaluationAverageTime; + private BigDecimal averageEvaluationDays; } From cd913734f40821883c512491fa7ac7cf2ffcf8d8 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 23 Jan 2025 16:19:04 +0530 Subject: [PATCH 27/81] Replaced field value from fields name to its actual labled value. --- .../gepafin/tendermanagement/dao/FormDao.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index b9b4da07..1c7ed019 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -465,17 +465,27 @@ public class FormDao { String value = (String) formFieldMap.get(fieldId); FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); - validator - .isRequired(value,fieldValidatorBean.getIsRequired(),contentResponseBean.getLabel()); + String fieldValue = getFieldValue(contentResponseBean); + validator.isRequired(value, fieldValidatorBean.getIsRequired(), fieldValue); }); if (Boolean.TRUE.equals(isSendValidationError)) { validator.validate(); } - if (validator.hasErrors()) { - return false; - } - return true; + return !validator.hasErrors(); } + + private String getFieldValue(ContentResponseBean contentResponseBean) { + // Use Optional with pattern matching for type checks + return contentResponseBean.getSettings().stream().filter(setting -> "label".equals(setting.getName()) && setting.getValue() != null) + .map(setting -> { + if (setting.getValue() instanceof String value) { + return value.trim(); + } else { + return String.valueOf(setting.getValue()).trim(); + } + }).filter(value -> !value.isEmpty()).findFirst().orElse(contentResponseBean.getId()); + } + public String validateVatNumber(String value,String customRule,String fieldId){ String error=null; From 38c414e2540439aba7fe8c906cb2a6b0280c798b Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 23 Jan 2025 18:51:31 +0530 Subject: [PATCH 28/81] Updated code for create assigned application --- .../dao/AssignedApplicationsDao.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index cc281df7..f9a3476f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -8,7 +8,6 @@ import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; -import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; @@ -80,8 +79,13 @@ public class AssignedApplicationsDao { log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); - if (assignedApplications != null) { + if (assignedApplications != null && assignedApplications.getUserId().equals(userId)) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); + } else if(assignedApplications != null) { + assignedApplications = reassignApplication(userId, assignedByUser, assignedApplications); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignedApplications); + log.info("Application re-assigned succesfully {}", assignApplicationToInstructorResponse); + return assignApplicationToInstructorResponse; } ApplicationEntity application = applicationService.validateApplication(applicationId); @@ -107,6 +111,30 @@ public class AssignedApplicationsDao { return assignApplicationToInstructorResponse; } + private AssignedApplicationsEntity reassignApplication(Long userId, UserEntity assignedByUser, + AssignedApplicationsEntity assignedApplication) { + + AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplication); + + setIfUpdated(assignedApplication::getAssignedBy, assignedApplication::setAssignedBy, assignedByUser.getId()); + setIfUpdated(assignedApplication::getUserId, assignedApplication::setUserId, userId); + assignedApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + Optional entityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplication.getId()); + if(entityOptional.isPresent()) { + ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(entityOptional.get()); + setIfUpdated(entityOptional.get()::getUserId, entityOptional.get()::setUserId, userId); + applicationEvaluationRepository.save(entityOptional.get()); + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(entityOptional.get()).build()); + + }; + assignedApplication = assignedApplicationsRepository.save(assignedApplication); + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApplicationEntity).newData(assignedApplication).build()); + + return assignedApplication; + } + public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { AssignedApplicationsEntity assignApplication = new AssignedApplicationsEntity(); assignApplication.setApplication(application); From 64b952204094c457c550858a3f41fc9b9dbf4ce3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 23 Jan 2025 19:59:17 +0530 Subject: [PATCH 29/81] Created endpoints for Evaluation form --- .../constants/GepafinConstant.java | 9 + .../dao/EvaluationFormDao.java | 171 ++++++++++++++++++ .../entities/EvaluationFormEntity.java | 29 +++ .../enums/UserActionContextEnum.java | 7 + .../model/request/EvaluationFormRequest.java | 14 ++ .../response/EvaluationFormResponseBean.java | 19 ++ .../EvalualtionFormRepository.java | 15 ++ .../service/EvaluationFormService.java | 28 +++ .../impl/EvaluationFormServiceImpl.java | 62 +++++++ .../web/rest/api/EvaluationFormApi.java | 101 +++++++++++ .../api/impl/EvaluationFormApiController.java | 88 +++++++++ .../db/changelog/db.changelog-1.0.0.xml | 22 ++- src/main/resources/message_en.properties | 9 + src/main/resources/message_it.properties | 10 +- 14 files changed, 582 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EvaluationFormRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/EvaluationFormResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 325bf286..5e14c667 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -390,5 +390,14 @@ public class GepafinConstant { public static final String VALIDATION_IN_TABLE = "validation.table.message"; public static final String CALL_EXPIRED="call.expired"; public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; + + + + public static final String EVALUATION_FORM_CREATED_SUCCESSFULLY = "evaluation.form.created.successfully"; + public static final String EVALUATION_FORM_UPDATED_SUCCESSFULLY = "evaluation.form.updated.successfully"; + public static final String EVALUATION_FORM_DELETED_SUCCESSFULLY = "evaluation.form.deleted.successfully"; + public static final String EVALUATION_FORM_FETCHED_SUCCESSFULLY = "evaluation.form.fetched.successfully"; + + public static final String EVALUATION_FORM_NOT_FOUND = "evaluation.form.not.found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java new file mode 100644 index 00000000..f56c83bb --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java @@ -0,0 +1,171 @@ +package net.gepafin.tendermanagement.dao; + + import jakarta.servlet.http.HttpServletRequest; + import net.gepafin.tendermanagement.config.Translator; + import net.gepafin.tendermanagement.constants.GepafinConstant; + import net.gepafin.tendermanagement.entities.*; + import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; + import net.gepafin.tendermanagement.model.request.*; + import net.gepafin.tendermanagement.model.response.ContentResponseBean; + import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; + import net.gepafin.tendermanagement.repositories.*; + import net.gepafin.tendermanagement.service.EvaluationCriteriaService; + import net.gepafin.tendermanagement.util.DateTimeUtil; + import net.gepafin.tendermanagement.util.LoggingUtil; + import net.gepafin.tendermanagement.util.Utils; + import net.gepafin.tendermanagement.util.Validator; + import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; + import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; + import net.gepafin.tendermanagement.web.rest.api.errors.Status; + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.stereotype.Component; + + import java.time.LocalDateTime; + import java.util.Collections; + import java.util.List; + import java.util.Optional; + import java.util.Set; + import java.util.stream.Collectors; + +@Component +public class EvaluationFormDao { + + @Autowired + private EvalualtionFormRepository evaluationFormRepository; + + @Autowired + private CallDao callDao; + + @Autowired + private VatCheckDao vatCheckDao; + + @Autowired + private CallRepository callRepository; + + @Autowired + private Validator validator; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; + + @Autowired + private EvaluationCriteriaService evaluationCriteriaService; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private HttpServletRequest request; + + public EvaluationFormEntity saveEvaluationFormEntity(EvaluationFormEntity evaluationFormEntity){ + evaluationFormEntity= evaluationFormRepository.save(evaluationFormEntity); + return evaluationFormEntity; + } + + public EvaluationFormEntity convertEvaluationFormRequestToEvaluationFormEntity(CallEntity callEntity, EvaluationFormRequest formRequest) { + + EvaluationFormEntity evaluationFormEntity = new EvaluationFormEntity(); + evaluationFormEntity.setCall(callEntity); + evaluationFormEntity.setLabel(formRequest.getLabel()); + evaluationFormEntity.setContent(setContentResponseBean(formRequest.getContent())); + evaluationFormEntity.setIsDeleted(false); + evaluationFormEntity = saveEvaluationFormEntity(evaluationFormEntity); + + /** This code is responsible for adding a version history log for the "Create form" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(evaluationFormEntity).build()); + + return evaluationFormEntity; + } + + public EvaluationFormResponseBean convertEvaluationFormEntityToEvaluationFormResponseBean(EvaluationFormEntity formEntity) { + EvaluationFormResponseBean evaluationFormResponseBean =new EvaluationFormResponseBean(); + evaluationFormResponseBean.setId(formEntity.getId()); + evaluationFormResponseBean.setContent(setContent(formEntity)); + evaluationFormResponseBean.setLabel(formEntity.getLabel()); + evaluationFormResponseBean.setCallId(formEntity.getCall().getId()); + evaluationFormResponseBean.setCallStatus(formEntity.getCall().getStatus()); + return evaluationFormResponseBean; + } + + private List setContent(EvaluationFormEntity formEntity) { + List contentList = Utils.convertJsonStringToList(formEntity.getContent(), + ContentResponseBean.class); + return contentList; + } + + public EvaluationFormResponseBean createEvaluationForm(CallEntity callEntity, EvaluationFormRequest formRequest) { + + validateEvaluationForm(formRequest); + EvaluationFormEntity formEntity = convertEvaluationFormRequestToEvaluationFormEntity(callEntity, formRequest); + return convertEvaluationFormEntityToEvaluationFormResponseBean(formEntity); + } + + public void validateEvaluationForm(EvaluationFormRequest formRequest){ + if(formRequest.getContent()==null || formRequest.getLabel()==null ){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); + } + } + public EvaluationFormResponseBean updateEvaluationForm(UserEntity user, Long formId, EvaluationFormRequest formRequest) { + EvaluationFormEntity evaluationFormEntity = validateForm(formId); + //cloned for old form data + EvaluationFormEntity oldFormData = Utils.getClonedEntityForData(evaluationFormEntity); + + Utils.setIfUpdated(evaluationFormEntity::getLabel, evaluationFormEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(evaluationFormEntity::getContent, evaluationFormEntity::setContent, setContentResponseBean(formRequest.getContent())); + evaluationFormEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + evaluationFormEntity = saveEvaluationFormEntity(evaluationFormEntity); + + /** This code is responsible for adding a version history log for the "Update form data" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFormData).newData(evaluationFormEntity).build()); + return convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity); + + } + + public EvaluationFormEntity validateForm(Long formId) { + EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByIdAndIsDeletedFalse(formId); + if (evaluationFormEntity == null) { + throw new ResourceNotFoundException( + Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.EVALUATION_FORM_NOT_FOUND) + ); + } + return evaluationFormEntity; + } + + + public EvaluationFormResponseBean getEvaluationFormById(UserEntity user, Long formId) { + EvaluationFormEntity evaluationFormEntity = validateForm(formId); + validator.validateUserWithCall(user, evaluationFormEntity.getCall().getId()); + return convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity); + } + public void deleteEvaluationForm(UserEntity user, Long formId){ + EvaluationFormEntity evaluationFormEntity = validateForm(formId); + EvaluationFormEntity clonedData = Utils.getClonedEntityForData(evaluationFormEntity); + validator.validateUserWithCall(user, evaluationFormEntity.getCall().getId()); + evaluationFormEntity.setIsDeleted(Boolean.TRUE); + evaluationFormEntity = saveEvaluationFormEntity(evaluationFormEntity); + /** This code is responsible for adding a version history log for the "soft deleting evaluation from field" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(clonedData).newData(evaluationFormEntity).build()); + + + } + public List getEvaluationFormsByCallId(CallEntity callEntity){ + if(callEntity== null){ + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); + } + List formEntities= evaluationFormRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); + List formResponseBeanList = formEntities.stream() + .map(req -> convertEvaluationFormEntityToEvaluationFormResponseBean(req)) + .collect(Collectors.toList()); + return formResponseBeanList; + } + public String setContentResponseBean(List contentRequestBeans){ + String stringContentRequest = Utils.convertListToJsonString(contentRequestBeans); + List cloneContentRequestBeans = Utils.convertJsonStringToList(stringContentRequest, ContentRequestBean.class); + cloneContentRequestBeans.forEach(data->data.setCriteria(null)); + return Utils.convertListToJsonString(cloneContentRequestBeans); + } + + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java new file mode 100644 index 00000000..9d3bd3fa --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +@Entity +@Table(name = "EVALUATION_FORM") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class EvaluationFormEntity extends BaseEntity{ + + + @Column(name = "LABEL") + private String label; + + @ManyToOne + @JoinColumn(name = "CALL_ID") + private CallEntity call; + + @Column(name = "CONTENT") + private String content; + + @Column(name="IS_DELETED") + private Boolean isDeleted; +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 64fd530c..e42a0fb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -172,6 +172,13 @@ public enum UserActionContextEnum { GET_ALL_APPLICATION_BY_PAGINATION("GET_ALL_APPLICATION_BY_PAGINATION"), + /** Evaluation form action context **/ + GET_EVALUATION_FORM("GET_EVALUATION_FORM"), + CREATE_EVALUATION_FORM("CREATE_EVALUATION_FORM"), + UPDATE_EVALUATION_FORM("UPDATE_EVALUATION_FORM"), + DELETE_EVALUATION_FORM("DELETE_EVALUATION_FORM"), + + GET_USER_ACTION("GET_USER_ACTION"), GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationFormRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationFormRequest.java new file mode 100644 index 00000000..bf8dad8f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationFormRequest.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class EvaluationFormRequest { + + private String label; + + private List content; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationFormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationFormResponseBean.java new file mode 100644 index 00000000..78abb382 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationFormResponseBean.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; + +@Data +public class EvaluationFormResponseBean { + + private Long id; + + private String callStatus; + + private String label; + + private Long callId; + + private List content; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java new file mode 100644 index 00000000..032eb9ed --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.EvaluationFormEntity; +import net.gepafin.tendermanagement.entities.FormEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +@Repository +public interface EvalualtionFormRepository extends JpaRepository { + + List findByCallIdAndIsDeletedFalse(Long callId); + EvaluationFormEntity findByIdAndIsDeletedFalse(Long formId); + List findByIdInAndIsDeletedFalse(List evaluationFormId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java new file mode 100644 index 00000000..77e99267 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.EvaluationFormEntity; +import net.gepafin.tendermanagement.entities.FormEntity; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; +import net.gepafin.tendermanagement.model.request.EvaluationFormRequest; +import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; +import net.gepafin.tendermanagement.model.response.FormResponseBean; + +import java.util.List; + +public interface EvaluationFormService { + + public EvaluationFormResponseBean createEvaluationForm(HttpServletRequest request, Long callId, EvaluationFormRequest formRequest); + + public EvaluationFormResponseBean updateEvaluationForm(HttpServletRequest request, Long evaluationFormId, EvaluationFormRequest formRequest); + + public EvaluationFormResponseBean getEvaluationFormById(HttpServletRequest request, Long evaluationFormId); + + public void deleteEvaluationForm(HttpServletRequest request, Long evaluationFormId); + + public EvaluationFormEntity validateEvaluationForm(Long id); + + public List getEvaluationFormsByCallId(HttpServletRequest request, Long callId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java new file mode 100644 index 00000000..2c7260e1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java @@ -0,0 +1,62 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.EvaluationFormDao; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.model.request.EvaluationFormRequest; +import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; +import net.gepafin.tendermanagement.service.EvaluationFormService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EvaluationFormServiceImpl implements EvaluationFormService { + + @Autowired + private EvaluationFormDao evalauationFormDao; + + @Autowired + private Validator validator; + + @Override + public EvaluationFormResponseBean createEvaluationForm(HttpServletRequest request, Long callId, EvaluationFormRequest evaluationFormRequest) { + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return evalauationFormDao.createEvaluationForm(call,evaluationFormRequest); + } + + @Override + public EvaluationFormResponseBean updateEvaluationForm(HttpServletRequest request, Long evaluationFormId, EvaluationFormRequest evaluationFormRequest) { + UserEntity user = validator.validateUser(request); + return evalauationFormDao.updateEvaluationForm(user, evaluationFormId,evaluationFormRequest); + } + + @Override + public EvaluationFormResponseBean getEvaluationFormById(HttpServletRequest request, Long evaluationFormId) { + UserEntity user = validator.validateUser(request); + return evalauationFormDao.getEvaluationFormById(user, evaluationFormId); + } + + @Override + public void deleteEvaluationForm(HttpServletRequest request, Long evaluationFormId) { + UserEntity user = validator.validateUser(request); + evalauationFormDao.deleteEvaluationForm(user, evaluationFormId); + } + + @Override + public EvaluationFormEntity validateEvaluationForm(Long id) { + return evalauationFormDao.validateForm(id); + } + + @Override + public List getEvaluationFormsByCallId(HttpServletRequest request, Long callId) { + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return evalauationFormDao.getEvaluationFormsByCallId(call); + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java new file mode 100644 index 00000000..727ea6e8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java @@ -0,0 +1,101 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.EvaluationFormRequest; +import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; +import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +public interface EvaluationFormApi { + + @Operation(summary = "Api to create Evaluation form", + 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) })) + }) + @PostMapping(value = "/call/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createEvaluationForm(HttpServletRequest request, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "evaluationForm request object", required = true) + @Valid @RequestBody EvaluationFormRequest evaluationFormRequest); + + + @Operation(summary = "Api to update Evaluation form", + 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) })) }) + @PutMapping(value = "/{evaluationFormId}", + produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + ResponseEntity> updateEvaluationForm(HttpServletRequest request, + @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId, + @Parameter(description = "Evaluation form request object", required = true) @Valid @RequestBody EvaluationFormRequest evaluationFormRequest); + + @Operation(summary = "Api to get Evaluation form by id", + 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 = "/{evaluationFormId}", + produces = { "application/json" }) + ResponseEntity> getEvaluationFormById(HttpServletRequest request, + @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId); + + + @Operation(summary = "Api to delete Evaluation form", + 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) })) }) + @DeleteMapping(value = "/{evaluationFormId}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + ResponseEntity> deleteEvaluationForm(HttpServletRequest request, + @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId); + + @Operation(summary = "Api to get Evaluation forms by callId", + 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}", + produces = { "application/json" }) + ResponseEntity>> getEvaluationFormsByCallId(HttpServletRequest request, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java new file mode 100644 index 00000000..f8058247 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java @@ -0,0 +1,88 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.EvaluationFormRequest; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.EvaluationFormService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.EvaluationFormApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/evaluationForm}") +public class EvaluationFormApiController implements EvaluationFormApi { + + @Autowired + private EvaluationFormService evaluationFormService; + + @Autowired + private LoggingUtil loggingUtil; + + @Override + public ResponseEntity> createEvaluationForm(HttpServletRequest request, Long callId, EvaluationFormRequest evaluationFormRequest) { + + /** This code is responsible for creating user action logs for the "Create Evaluation form" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_EVALUATION_FORM).build()); + + EvaluationFormResponseBean evaluationFormResponseBean = evaluationFormService.createEvaluationForm(request,callId, evaluationFormRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(evaluationFormResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> updateEvaluationForm(HttpServletRequest request, Long evaluationFormId, EvaluationFormRequest evaluationFormRequest) { + + /** This code is responsible for creating user action logs for the "Update Evaluation form" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_EVALUATION_FORM).build()); + + EvaluationFormResponseBean evaluationFormResponseBean = evaluationFormService.updateEvaluationForm(request, evaluationFormId, evaluationFormRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(evaluationFormResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getEvaluationFormById(HttpServletRequest request, Long evaluationFormId) { + + /** This code is responsible for creating user action logs for the "Get Evaluation form by id" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_EVALUATION_FORM).build()); + + EvaluationFormResponseBean evaluationFormResponseBean= evaluationFormService.getEvaluationFormById(request,evaluationFormId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(evaluationFormResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteEvaluationForm(HttpServletRequest request, Long evaluationFormId) { + + /** This code is responsible for creating user action logs for the "delete Evaluation form" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_EVALUATION_FORM).build()); + + evaluationFormService.deleteEvaluationForm(request,evaluationFormId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_DELETED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity>> getEvaluationFormsByCallId(HttpServletRequest request, Long callId) { + + /** This code is responsible for creating user action logs for the "Get Evaluation forms by call id" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_EVALUATION_FORM).build()); + + List evaluationFormResponseBean= evaluationFormService.getEvaluationFormsByCallId(request,callId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(evaluationFormResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_FETCHED_SUCCESSFULLY))); + } + +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 59d3147a..4e282d43 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2253,5 +2253,25 @@ unique_uuid = 'p4lk3bcx1RStqTaIVVbXs' - + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 5fcbc7f7..6c824cbc 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -353,3 +353,12 @@ action.context.labels.fetched.successfully = Action Context Labels Fetched Succe amount.accepted.required=Amount accepted is required while approving the application. call.expired=Call has been expired. amount.request.should.greated.then.zero=Requested amount should not be empty and should be greater than zero. + + + +evaluation.form.created.successfully=Evaluation form created successfully. +evaluation.form.updated.successfully=Evaluation form updated successfully. +evaluation.form.deleted.successfully=Evaluation form deleted successfully. +evaluation.form.fetched.successfully=Evaluation form fetched successfully. +evaluation.form.not.found=Evaluation form not found. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index fd355f2f..cca4b808 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -343,4 +343,12 @@ action.context.labels.fetched.successfully = Etichette del contesto dell'azione amount.accepted.required=L'importo accettato ďż˝ obbligatorio durante l'approvazione della domanda. call.expired=La chiamata ďż˝ scaduta. amount.request.should.greated.then.zero=L'importo richiesto non deve essere vuoto e deve essere maggiore di zero. -call.expired=La chiamata ďż˝ scaduta. + + + +evaluation.form.created.successfully=Modulo di valutazione creato con successo. +evaluation.form.updated.successfully=Modulo di valutazione aggiornato con successo. +evaluation.form.deleted.successfully=Modulo di valutazione eliminato con successo. +evaluation.form.fetched.successfully=Modulo di valutazione recuperato con successo. +evaluation.form.not.found=Modulo di valutazione non trovato. + From 28346cbfb2229eb2824cc20bacc6cf08fc5a8ae0 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 24 Jan 2025 18:14:05 +0530 Subject: [PATCH 30/81] Updated code for assigned application dashboard API --- .../gepafin/tendermanagement/dao/DashboardDao.java | 4 ++-- .../AssignedApplicationWidgetResponseBean.java | 4 ++-- .../AssignedApplicationsRepository.java | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 1d0bc307..d88319e1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -397,8 +397,8 @@ public class DashboardDao { response.setNumberOfAssignedApplication(data[0] instanceof Number ? ((Number) data[0]).longValue() : 0L); response.setNumberOfApplicationInAmendmentState(data[1] instanceof Number ? ((Number) data[1]).longValue() : 0L); - response.setNumberOfApplicationInEvaluationState(data[2] instanceof Number ? ((Number) data[2]).longValue() : 0L); - response.setNumberOfAcceptedApplication(data[3] instanceof Number ? ((Number) data[3]).longValue() : 0L); + response.setNumberOfApplicationInOpenState(data[2] instanceof Number ? ((Number) data[2]).longValue() : 0L); + response.setNumberOfApplicationInCloseState(data[3] instanceof Number ? ((Number) data[3]).longValue() : 0L); return response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java index 186ff323..c6e2ac0f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationWidgetResponseBean.java @@ -8,8 +8,8 @@ import java.math.BigDecimal; public class AssignedApplicationWidgetResponseBean { private Long numberOfAssignedApplication; private Long numberOfApplicationInAmendmentState; - private Long numberOfAcceptedApplication; - private Long numberOfApplicationInEvaluationState; + private Long numberOfApplicationInCloseState; + private Long numberOfApplicationInOpenState; private Long numberOfApplicationExpiringIn48Hours; private BigDecimal averageEvaluationDays; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 16fa4928..f48833aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -29,13 +29,14 @@ public interface AssignedApplicationsRepository extends JpaRepository Date: Fri, 24 Jan 2025 19:33:47 +0530 Subject: [PATCH 31/81] Updated code for evaluation-v2(call) --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/ApplicationDao.java | 2 + .../gepafin/tendermanagement/dao/CallDao.java | 21 +++++++++- .../dao/EvaluationFormDao.java | 17 ++++---- .../entities/ApplicationEntity.java | 3 ++ .../tendermanagement/entities/CallEntity.java | 3 ++ .../enums/EvaluationVersionEnum.java | 40 +++++++++++++++++++ .../enums/UserActionContextEnum.java | 5 +++ .../model/request/CreateCallRequestStep1.java | 2 + .../CreateCallRequestStep2EvaluationV2.java | 14 +++++++ .../model/request/UpdateCallRequestStep1.java | 3 ++ .../model/response/ApplicationResponse.java | 3 ++ .../response/CallDetailsResponseBean.java | 3 ++ .../model/response/CallResponse.java | 3 ++ .../EvalualtionFormRepository.java | 2 +- .../tendermanagement/service/CallService.java | 10 ++--- .../service/EvaluationFormService.java | 2 +- .../service/impl/CallServiceImpl.java | 14 ++++--- .../impl/CallValidatorServiceImpl.java | 22 ++++++---- .../impl/EvaluationFormServiceImpl.java | 4 +- .../web/rest/api/CallApi.java | 21 ++++++++-- .../web/rest/api/EvaluationFormApi.java | 2 +- .../web/rest/api/impl/CallApiController.java | 12 ++++++ .../api/impl/EvaluationFormApiController.java | 4 +- .../db/changelog/db.changelog-1.0.0.xml | 19 +++++++++ .../updated_form_field_data_24-01-2025.sql | 17 ++++++++ 26 files changed, 214 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/EvaluationVersionEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2EvaluationV2.java create mode 100644 src/main/resources/db/dump/updated_form_field_data_24-01-2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5e14c667..6b5a9c3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -399,5 +399,7 @@ public class GepafinConstant { public static final String EVALUATION_FORM_FETCHED_SUCCESSFULLY = "evaluation.form.fetched.successfully"; public static final String EVALUATION_FORM_NOT_FOUND = "evaluation.form.not.found"; + + public static final String EVALUATION_V2_STEP_2 = "EVALUATION_V2_STEP_2"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 6284abc5..174313ca 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -234,6 +234,7 @@ public class ApplicationDao { entity.setUserWithCompany(userWithCompany); entity.setIsDeleted(false); entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); + entity.setEvaluationVersion(call.getEvaluationVersion()); return entity; } @@ -413,6 +414,7 @@ public class ApplicationDao { responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setStatus(applicationEntity.getStatus()); + responseBean.setEvaluationVersion(EvaluationVersionEnum.valueOf(applicationEntity.getCall().getEvaluationVersion())); responseBean.setComments(applicationEntity.getComments()); responseBean.setCompanyId(applicationEntity.getCompanyId()); Optional assignedApplicationsOptional = diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0f7a9f5a..ce9fefd9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -116,6 +116,9 @@ public class CallDao { @Autowired private NotificationTypeRepository notificationTypeRepository; + @Autowired + private EvaluationFormDao evalualtionFormDao; + public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); CallEntity callEntity = convertToCallEntity(createCallRequest, userEntity); @@ -178,6 +181,7 @@ public class CallDao { } } callEntity.setStatus(CallStatusEnum.DRAFT.getValue()); + callEntity.setEvaluationVersion(createCallRequest.getEvaluationVersion().getValue()); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmount()); callEntity.setConfidi(false); @@ -362,6 +366,7 @@ public class CallDao { createCallResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); createCallResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); createCallResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); + createCallResponseBean.setEvaluationVersion(EvaluationVersionEnum.valueOf(callEntity.getEvaluationVersion())); createCallResponseBean.setRegionId(callEntity.getRegion().getId()); createCallResponseBean.setAmount(callEntity.getAmount()); createCallResponseBean.setAmountMax(callEntity.getAmountMax()); @@ -601,6 +606,7 @@ public class CallDao { setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime())); setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); + setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "update call step 1" operation **/ @@ -691,6 +697,7 @@ public class CallDao { callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); + callDetailsResponseBean.setEvaluationVersion(EvaluationVersionEnum.valueOf(callEntity.getEvaluationVersion())); callDetailsResponseBean.setRegionId(callEntity.getRegion().getId()); callDetailsResponseBean.setAmount(callEntity.getAmount()); callDetailsResponseBean.setAmountMax(callEntity.getAmountMax()); @@ -811,7 +818,8 @@ public class CallDao { CallResponse callResponseBean = getCallResponseBean(callEntity); FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId()); List formResponseBean = formDao.getFormsByCallId(callEntity); - CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean); + EvaluationFormResponseBean evaluationFormResponseBean = evalualtionFormDao.getEvaluationFormByCallId(callEntity); + CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean,evaluationFormResponseBean); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callEntity = callRepository.save(callEntity); @@ -1063,4 +1071,15 @@ public class CallDao { return predicates; } + + public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) { + + convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); + + convertToDocumentEntities(createCallRequest.getImages(), callEntity.getId(), DocumentTypeEnum.IMAGES); + + CallResponse createCallResponseBean = getCallResponseBean(callEntity); + createCallResponseBean.setCurrentStep(GepafinConstant.EVALUATION_V2_STEP_2); + return createCallResponseBean; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java index f56c83bb..594aa24d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java @@ -149,17 +149,20 @@ public class EvaluationFormDao { } - public List getEvaluationFormsByCallId(CallEntity callEntity){ - if(callEntity== null){ + public EvaluationFormResponseBean getEvaluationFormByCallId(CallEntity callEntity) { + if (callEntity == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); } - List formEntities= evaluationFormRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); - List formResponseBeanList = formEntities.stream() - .map(req -> convertEvaluationFormEntityToEvaluationFormResponseBean(req)) - .collect(Collectors.toList()); - return formResponseBeanList; + + EvaluationFormEntity formEntity = evaluationFormRepository + .findByCallIdAndIsDeletedFalse(callEntity.getId()); + if(formEntity!=null) + return convertEvaluationFormEntityToEvaluationFormResponseBean(formEntity); + else return null; } + + public String setContentResponseBean(List contentRequestBeans){ String stringContentRequest = Utils.convertListToJsonString(contentRequestBeans); List cloneContentRequestBeans = Utils.convertJsonStringToList(stringContentRequest, ContentRequestBean.class); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index c6880af4..a482f453 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -68,4 +68,7 @@ public class ApplicationEntity extends BaseEntity { @Column(name="DATE_REJECTED") private LocalDateTime dateRejected; + @Column(name = "evaluationVersion") + private String evaluationVersion; + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 1c6181b2..990d27a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -88,5 +88,8 @@ public class CallEntity extends BaseEntity { @ManyToOne @JoinColumn(name = "HUB_ID") private HubEntity hub; + + @Column(name = "evaluationVersion") + private String evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EvaluationVersionEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EvaluationVersionEnum.java new file mode 100644 index 00000000..ff8c35fc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/EvaluationVersionEnum.java @@ -0,0 +1,40 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public enum EvaluationVersionEnum { + V1("V1"), + V2("V2"); + private String value; + + EvaluationVersionEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static EvaluationVersionEnum fromValue(String value) { + for (EvaluationVersionEnum b : EvaluationVersionEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + public static List getStatusValues() { + return Arrays.stream(EvaluationVersionEnum.values()) + .map(EvaluationVersionEnum::getValue) + .collect(Collectors.toList()); + } +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index e42a0fb8..76bed042 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -13,6 +13,11 @@ public enum UserActionContextEnum { GET_CALL("GET_CALL"), DOWNLOAD_CALL_DOCUMENT("DOWNLOAD_CALL_DOCUMENT"), + + /** Evaluation V2 call action context **/ + EVALUATION_V2_CREATE_UPDATE_CALL_STEP_2("EVALUATION_V2_CREATE_UPDATE_CALL_STEP_2"), + + /** user action context **/ CREATE_USER("CREATE_USER"), USER_LOGIN("USER_LOGIN"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 6ca30e37..75c2a3d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.util.List; import lombok.Data; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; @Data public class CreateCallRequestStep1 { @@ -41,4 +42,5 @@ public class CreateCallRequestStep1 { private List faq; + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2EvaluationV2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2EvaluationV2.java new file mode 100644 index 00000000..68430bff --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2EvaluationV2.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class CreateCallRequestStep2EvaluationV2 { + + private List docs; + + private List images; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java index e57f8715..d63e5754 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -6,6 +6,7 @@ import java.time.LocalTime; import java.util.List; import lombok.Data; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; @Data public class UpdateCallRequestStep1 { @@ -40,4 +41,6 @@ public class UpdateCallRequestStep1 { private List faq; + private EvaluationVersionEnum evaluationVersion; + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java index 2c659838..559edcc7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseBean; import java.math.BigDecimal; @@ -49,4 +50,6 @@ public class ApplicationResponse{ private LocalDateTime dateRejected; + private EvaluationVersionEnum evaluationVersion; + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 4028b789..ebe82d1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -55,4 +56,6 @@ public class CallDetailsResponseBean { private LocalDateTime updatedDate; private Long preferredCallId; + + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 43655e9c..01c36068 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -8,6 +8,7 @@ import java.util.List; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.util.DynamicLocalTimeSerializer; @Data @@ -74,6 +75,8 @@ public class CallResponse { private String currentStep; private Long preferredCallId; + + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java index 032eb9ed..fb658f54 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvalualtionFormRepository.java @@ -9,7 +9,7 @@ import java.util.List; @Repository public interface EvalualtionFormRepository extends JpaRepository { - List findByCallIdAndIsDeletedFalse(Long callId); + EvaluationFormEntity findByCallIdAndIsDeletedFalse(Long callId); EvaluationFormEntity findByIdAndIsDeletedFalse(Long formId); List findByIdInAndIsDeletedFalse(List evaluationFormId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index b12a3398..0e1838b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -5,17 +5,15 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.response.PageableResponseBean; public interface CallService { - CallResponse createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); + CallResponse createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest ); CallResponse createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest); @@ -36,5 +34,7 @@ public interface CallService { byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId); PageableResponseBean> getAllCallsByPagination(HttpServletRequest request, Long companyId , Boolean onlyPreferredCall,CallPageableRequestBean callPageableRequestBean); + + CallResponse createCallStep2EvaluationV2(HttpServletRequest request, Long callId, CreateCallRequestStep2EvaluationV2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java index 77e99267..d359e0aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationFormService.java @@ -23,6 +23,6 @@ public interface EvaluationFormService { public EvaluationFormEntity validateEvaluationForm(Long id); - public List getEvaluationFormsByCallId(HttpServletRequest request, Long callId); + public EvaluationFormResponseBean getEvaluationFormByCallId(HttpServletRequest request, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 07823f1c..a621662c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -5,10 +5,8 @@ import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.response.PageableResponseBean; @@ -110,5 +108,11 @@ public class CallServiceImpl implements CallService { UserEntity user = validator.validateUser(request); return callDao.getAllCallsByPagination(request,user,companyId,onlyPreferredCall,callPageableRequestBean); } - + @Override + @Transactional(rollbackFor = Exception.class) + public CallResponse createCallStep2EvaluationV2(HttpServletRequest request, Long callId, CreateCallRequestStep2EvaluationV2 createCallRequest) { + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.createCallStep2EvaluationV2(call, createCallRequest, user); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index 3c7091cf..6c3024c6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -6,7 +6,9 @@ import java.util.List; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.util.FieldValidator; @@ -15,7 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; public class CallValidatorServiceImpl { - public static void validateResponse(CallResponse response, FlowResponseBean flowResponse, List formResponses) { + public static void validateResponse(CallResponse response, FlowResponseBean flowResponse, List formResponses, EvaluationFormResponseBean evaluationFormResponseBean) { // Validate CallResponse (existing logic) FieldValidator data = FieldValidator.create() .notNull(response.getId(), "id") @@ -28,29 +30,35 @@ public class CallValidatorServiceImpl { .notNull(response.getRegionId(), "regionId") .notNull(response.getAmount(), "amount") .notNull(response.getAmountMax(), "amountMax") - .notNull(response.getThreshold(), "threshold") .notNull(response.getEmail(),"email") .notNull(response.getAmountMin(),"amountMin") .notNull(response.getStartTime(),"startTime") .notNull(response.getEndTime(),"endTime") .notNull(response.getDocumentationRequested(), "documentationRequested") .notEmpty(response.getAimedTo(), "aimedTo") - .notEmpty(response.getCriteria(), "criteria") - .notEmpty(response.getDocs(), "docs") - .notEmpty(response.getCheckList(), "checkList"); + .notEmpty(response.getDocs(), "docs"); + if (response.getEvaluationVersion() == EvaluationVersionEnum.V1) { + data = data.notEmpty(response.getCheckList(), "checkList") + .notEmpty(response.getCriteria(), "criteria") + .notNull(response.getThreshold(), "threshold"); + } + if (response.getEvaluationVersion() == EvaluationVersionEnum.V2 && evaluationFormResponseBean == null) { + data.addError(Translator.toLocale(GepafinConstant.EVALUATION_FORM_NOT_FOUND)); + } if (response.getDates().get(0) == null || response.getDates().get(1) == null || response.getDates().get(0).toLocalDate().isBefore(LocalDate.now()) || response.getDates().get(1).toLocalDate().isBefore(LocalDate.now()) || response.getDates().get(0).toLocalDate().isAfter(response.getDates().get(1).toLocalDate())) { data = data.addError(Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); } - if (flowResponse == null || ((flowResponse.getFlowData() == null || flowResponse.getFlowData().isEmpty()) + + if (response.getEvaluationVersion() == EvaluationVersionEnum.V1 &&(flowResponse == null || ((flowResponse.getFlowData() == null || flowResponse.getFlowData().isEmpty())) && (flowResponse.getFlowEdges() == null || flowResponse.getFlowEdges().isEmpty()))) { data.addError(Translator.toLocale(GepafinConstant.FLOW_NOT_FOUND)); } - if (formResponses == null || formResponses.isEmpty()) { + if (response.getEvaluationVersion() == EvaluationVersionEnum.V1 &&(formResponses == null || formResponses.isEmpty()) ){ data.addError(Translator.toLocale(GepafinConstant.FORM_NOT_FOUND)); } data.validate(); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java index 2c7260e1..568bad0c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationFormServiceImpl.java @@ -52,10 +52,10 @@ public class EvaluationFormServiceImpl implements EvaluationFormService { } @Override - public List getEvaluationFormsByCallId(HttpServletRequest request, Long callId) { + public EvaluationFormResponseBean getEvaluationFormByCallId(HttpServletRequest request, Long callId) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); - return evalauationFormDao.getEvaluationFormsByCallId(call); + return evalauationFormDao.getEvaluationFormByCallId(call); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index e14ed8e7..37af42d4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -3,7 +3,8 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.PageableResponseBean; import org.springframework.http.MediaType; @@ -19,9 +20,6 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.util.Response; @@ -164,5 +162,20 @@ public interface CallApi { ResponseEntity>>> getAllCallsByPagination(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall, @RequestBody CallPageableRequestBean callPageableRequestBean); + @Operation(summary = "Api to update call step 2 (Evaluation V2)", + 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) })) + }) + @PutMapping(value = "/step2-v2/{callId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createCallStep2EvaluationV2(HttpServletRequest request, + @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "Call request object", required = true) @Valid @RequestBody CreateCallRequestStep2EvaluationV2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java index 727ea6e8..c74fa829 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java @@ -95,7 +95,7 @@ public interface EvaluationFormApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/call/{callId}", produces = { "application/json" }) - ResponseEntity>> getEvaluationFormsByCallId(HttpServletRequest request, + ResponseEntity> getEvaluationFormByCallId(HttpServletRequest request, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 85de9a1c..4ea1c575 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.*; @@ -160,6 +161,17 @@ public class CallApiController implements CallApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(callsByPagination, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createCallStep2EvaluationV2(HttpServletRequest request, Long callId, CreateCallRequestStep2EvaluationV2 createCallRequest) { + /** This code is responsible for creating user action logs for the "Create or update Call step 2 for Evaluation V2" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.EVALUATION_V2_CREATE_UPDATE_CALL_STEP_2).build()); + + CallResponse createCallStep2EvaluationV2 = callService.createCallStep2EvaluationV2(request, callId, createCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallStep2EvaluationV2, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java index f8058247..1353ccd9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationFormApiController.java @@ -75,12 +75,12 @@ public class EvaluationFormApiController implements EvaluationFormApi { } @Override - public ResponseEntity>> getEvaluationFormsByCallId(HttpServletRequest request, Long callId) { + public ResponseEntity> getEvaluationFormByCallId(HttpServletRequest request, Long callId) { /** This code is responsible for creating user action logs for the "Get Evaluation forms by call id" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_EVALUATION_FORM).build()); - List evaluationFormResponseBean= evaluationFormService.getEvaluationFormsByCallId(request,callId); + EvaluationFormResponseBean evaluationFormResponseBean= evaluationFormService.getEvaluationFormByCallId(request,callId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(evaluationFormResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FORM_FETCHED_SUCCESSFULLY))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 4e282d43..e4bfdfe5 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2274,4 +2274,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/updated_form_field_data_24-01-2025.sql b/src/main/resources/db/dump/updated_form_field_data_24-01-2025.sql new file mode 100644 index 00000000..0ffa1926 --- /dev/null +++ b/src/main/resources/db/dump/updated_form_field_data_24-01-2025.sql @@ -0,0 +1,17 @@ +UPDATE FORM_FIELD +SET SETTINGS = '[{"name": "label", "value": "Numero"}, {"name": "placeholder", "value": 0}, {"name": "step", "value": 0}, {"name": "isRequestedAmount", "value": false}, {"name": "variable", "value": []}, {"name": "formula", "value": ""}]' +WHERE ID = 4; + +INSERT INTO FORM_FIELD (ID, SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( + 21, + 21, + 'criteria_table', + 'Tabella di criteri', + 'Tabella di criteri', + '[{"name": "label", "value": "Tabella"}, {"name": "criteria_table_columns", "value": {}}, {"name": "variable", "value": []}]', + '{"custom": "nonEmptyTables"}', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +); \ No newline at end of file From 9f6adf7b924512c6ec5f03e5ff23e7327e5f0b57 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 27 Jan 2025 12:00:32 +0530 Subject: [PATCH 32/81] Added applicationEvalutionId in application table --- .../dao/ApplicationEvaluationDao.java | 32 +++++++++++++------ .../entities/ApplicationEntity.java | 3 ++ .../db/changelog/db.changelog-1.0.0.xml | 13 ++++++++ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 48573e4f..74a14114 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -634,16 +634,33 @@ public class ApplicationEvaluationDao { application.setAmountAccepted(req.getAmountAccepted()); } actionType = VersionActionTypeEnum.UPDATE; + + entity = applicationEvaluationRepository.save(entity); + } else { AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); entity = convertToEntity(user, req, assignedApplicationId); actionType = VersionActionTypeEnum.INSERT; + + entity = applicationEvaluationRepository.save(entity); + + ApplicationEntity oldApplication = Utils.getClonedEntityForData(application); + + application.setApplicationEvaluationId(entity.getId()); + + /** This code is responsible for adding a version history log for the "Update Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplication).newData(application).build()); Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToInstructor(placeHolders,entity,NotificationTypeEnum.EVALUATION_CREATION); } + + + /** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationEvaluation).newData(entity).build()); + ApplicationStatusForEvaluation status = req.getApplicationStatus(); // Fetch all amendment request entities associated with the evaluation ID List applicationAmendmentRequestEntities = @@ -653,21 +670,16 @@ public class ApplicationEvaluationDao { } // Fetch amendment details from the request if(req.getAmendmentDetails()!=null) { - List amendmentDetailsRequests = req.getAmendmentDetails(); - - updateAmendmentDocumentsAndFormFields(applicationAmendmentRequestEntities, amendmentDetailsRequests); -} - - ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); - - /** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationEvaluation).newData(entity).build()); + List amendmentDetailsRequests = req.getAmendmentDetails(); + + updateAmendmentDocumentsAndFormFields(applicationAmendmentRequestEntities, amendmentDetailsRequests); + } if (status != null) { AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get(); return updateApplicationEvaluationStatus(application, assignedApplicationsEntity, status); } else { - return convertToResponse(savedEntity); + return convertToResponse(entity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index a482f453..50d16557 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -70,5 +70,8 @@ public class ApplicationEntity extends BaseEntity { @Column(name = "evaluationVersion") private String evaluationVersion; + + @Column(name = "APPLICATION_EVALUATION_ID") + private Long applicationEvaluationId; } \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index e4bfdfe5..b987fd7c 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2292,5 +2292,18 @@ + + + + + + + + + + EXISTS (SELECT 1 FROM application_evaluation ae WHERE ae.application_id = application.id) + + + From cc94edc2651c2f04526c474c48b9caecf1dc8ad9 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 27 Jan 2025 12:40:44 +0530 Subject: [PATCH 33/81] Updated assigned application response --- .../tendermanagement/dao/AssignedApplicationsDao.java | 2 ++ .../model/response/AssignedApplicationsResponse.java | 2 ++ .../web/rest/api/EvaluationFormApi.java | 10 +++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index f9a3476f..c8e45af4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -11,6 +11,7 @@ import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; @@ -202,6 +203,7 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setSubmissionDate(submissionDate); assignedApplicationsResponse.setCallEndDate(callEndDate); assignedApplicationsResponse.setCallStartDate(callStartDate); + assignedApplicationsResponse.setEvaluationVersion(EvaluationVersionEnum.valueOf(application.getCall().getEvaluationVersion())); if(applicationEvaluationEntity.isPresent()){ assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate()); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index b975c150..83c1ab0a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.BaseBean; import java.time.LocalDateTime; @@ -22,6 +23,7 @@ public class AssignedApplicationsResponse extends BaseBean { private LocalDateTime callEndDate; private String companyName; private LocalDateTime evaluationEndDate; + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java index c74fa829..66903a51 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationFormApi.java @@ -22,7 +22,7 @@ import java.util.List; public interface EvaluationFormApi { - @Operation(summary = "Api to create Evaluation form", + @Operation(summary = "Api to create Evaluation form (Evaluation V2)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -39,7 +39,7 @@ public interface EvaluationFormApi { @Valid @RequestBody EvaluationFormRequest evaluationFormRequest); - @Operation(summary = "Api to update Evaluation form", + @Operation(summary = "Api to update Evaluation form (Evaluation V2)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -55,7 +55,7 @@ public interface EvaluationFormApi { @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId, @Parameter(description = "Evaluation form request object", required = true) @Valid @RequestBody EvaluationFormRequest evaluationFormRequest); - @Operation(summary = "Api to get Evaluation form by id", + @Operation(summary = "Api to get Evaluation form by id (Evaluation V2)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -70,7 +70,7 @@ public interface EvaluationFormApi { @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId); - @Operation(summary = "Api to delete Evaluation form", + @Operation(summary = "Api to delete Evaluation form (Evaluation V2)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -84,7 +84,7 @@ public interface EvaluationFormApi { ResponseEntity> deleteEvaluationForm(HttpServletRequest request, @Parameter(description = "The Evaluation form ID", required = true) @PathVariable("evaluationFormId") Long evaluationFormId); - @Operation(summary = "Api to get Evaluation forms by callId", + @Operation(summary = "Api to get Evaluation forms by callId (Evaluation V2)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { From c396eaf1421f9ce3f2983934b73ace56823d926d Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 27 Jan 2025 13:01:46 +0530 Subject: [PATCH 34/81] Updated code --- .../service/impl/CallValidatorServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index 6c3024c6..eaa3ba13 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -54,11 +54,11 @@ public class CallValidatorServiceImpl { data = data.addError(Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); } - if (response.getEvaluationVersion() == EvaluationVersionEnum.V1 &&(flowResponse == null || ((flowResponse.getFlowData() == null || flowResponse.getFlowData().isEmpty())) - && (flowResponse.getFlowEdges() == null || flowResponse.getFlowEdges().isEmpty()))) { + if (flowResponse == null || ((flowResponse.getFlowData() == null || flowResponse.getFlowData().isEmpty())) + && (flowResponse.getFlowEdges() == null || flowResponse.getFlowEdges().isEmpty())) { data.addError(Translator.toLocale(GepafinConstant.FLOW_NOT_FOUND)); } - if (response.getEvaluationVersion() == EvaluationVersionEnum.V1 &&(formResponses == null || formResponses.isEmpty()) ){ + if (formResponses == null || formResponses.isEmpty()) { data.addError(Translator.toLocale(GepafinConstant.FORM_NOT_FOUND)); } data.validate(); From 8aeb6b05248829b78598ead92037c94567a11678 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 27 Jan 2025 18:00:50 +0530 Subject: [PATCH 35/81] Done ticket GEPAFINBE-149 --- .../constants/GepafinConstant.java | 2 ++ .../dao/AssignedApplicationsDao.java | 28 ++++++++++--------- .../enums/AssignedApplicationEnum.java | 3 ++ .../enums/UserActionContextEnum.java | 1 + .../request/AssignedApplicationsRequest.java | 1 - .../service/AssignedApplicationsService.java | 2 ++ .../impl/AssignedApplicationsServiceImpl.java | 6 +++- .../web/rest/api/AssignedApplicationsApi.java | 18 +++++++++++- .../impl/AssignedApplicationsController.java | 15 ++++++++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 ++ 11 files changed, 64 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6b5a9c3e..8e2828e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -401,5 +401,7 @@ public class GepafinConstant { public static final String EVALUATION_FORM_NOT_FOUND = "evaluation.form.not.found"; public static final String EVALUATION_V2_STEP_2 = "EVALUATION_V2_STEP_2"; + + public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index c8e45af4..6211a017 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -4,19 +4,13 @@ import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; -import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; -import net.gepafin.tendermanagement.entities.CompanyEntity; -import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; -import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; -import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; @@ -37,6 +31,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -120,6 +115,7 @@ public class AssignedApplicationsDao { setIfUpdated(assignedApplication::getAssignedBy, assignedApplication::setAssignedBy, assignedByUser.getId()); setIfUpdated(assignedApplication::getUserId, assignedApplication::setUserId, userId); assignedApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + assignedApplication.setStatus(AssignedApplicationEnum.AWAITING.getValue()); Optional entityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplication.getId()); if(entityOptional.isPresent()) { ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(entityOptional.get()); @@ -141,10 +137,7 @@ public class AssignedApplicationsDao { assignApplication.setApplication(application); assignApplication.setAssignedBy(assignedByUser.getId()); assignApplication.setUserId(userId); - assignApplication.setStatus(AssignedApplicationEnum.OPEN.getValue()); - if (assignedApplicationsRequest.getStatus() != null) { - assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); - } + assignApplication.setStatus(AssignedApplicationEnum.AWAITING.getValue()); assignApplication.setNote(assignedApplicationsRequest.getNote()); assignApplication.setIsDeleted(false); assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -287,5 +280,14 @@ public class AssignedApplicationsDao { log.info("Assigned application fetched successfully: {}", response); return response; } + public AssignedApplicationsResponse updateAssignedApplicationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedApplicationEnum status) { + AssignedApplicationsEntity assignedApplication = validateAssignedApplication(assignedApplicationId); + validator.validatePreInstructor(request, assignedApplication.getUserId()); + + AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplication); + assignedApplication.setStatus(status.getValue()); + AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(assignedApplication, oldAssignedApplicationEntity, VersionActionTypeEnum.UPDATE); + return convertEntityToResponse(updatedAssignment); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java index 59f8ae1d..be3f6b1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java @@ -5,6 +5,9 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum AssignedApplicationEnum { OPEN ("OPEN"), SOCCORSO("SOCCORSO"), + + AWAITING("AWAITING"), + CLOSE("CLOSE"); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 03f878bf..4a4d1109 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -109,6 +109,7 @@ public enum UserActionContextEnum { DELETE_ASSIGNED_APPLICATION("DELETE_ASSIGNED_APPLICATION"), GET_ASSIGNED_APPLICATION("GET_ASSIGNED_APPLICATION"), UPDATE_ASSIGNED_APPLICATION_DETAILS("UPDATE_ASSIGNED_APPLICATION_DETAILS"), + UPDATE_ASSIGNED_APPLICATION_STATUS("UPDATE_ASSIGNED_APPLICATION_STATUS"), /** Assigned form field context **/ CREATE_FORM_FIELD("CREATE_FORM_FIELD"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java index ef4cd3c3..998e3715 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java @@ -6,5 +6,4 @@ import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; @Data public class AssignedApplicationsRequest { private String note; - private AssignedApplicationEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java index 1a73c674..d37f19b6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -19,4 +20,5 @@ public interface AssignedApplicationsService { AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, UpdateAssignedApplicationRequest assignedApplicationsRequest); AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId); + AssignedApplicationsResponse updateAssignedApplicationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedApplicationEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java index c820d929..85082d15 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.AssignedApplicationsDao; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -60,5 +61,8 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ public AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId) { return assignedApplicationsDao.validateAssignedApplication(assignedApplicationId); } - + @Override + public AssignedApplicationsResponse updateAssignedApplicationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedApplicationEnum status) { + return assignedApplicationsDao.updateAssignedApplicationStatus(request, assignedApplicationId, status); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java index 144a20f4..4b2fe64b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -6,8 +6,11 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -96,7 +99,20 @@ public interface AssignedApplicationsApi { @GetMapping(value = "/{id}", produces = "application/json") ResponseEntity> getAssignedApplicationById(HttpServletRequest request, @Parameter(description = "The assigned application id", required = true) @PathVariable(value = "id", required = true) Long id); - + + @Operation(summary = "Api to update assigned application status", + 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) })) }) + @PutMapping(value = "/{id}/status", produces = { "application/json" }) + ResponseEntity> updateAssignedApplicationStatus(HttpServletRequest request, + @Parameter(description = "The assigned application id", required = true) @PathVariable("id") Long id, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) AssignedApplicationEnum status); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java index 78cc47dd..459824a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -4,11 +4,14 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.AssignedApplicationsService; @@ -89,6 +92,18 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } + @Override + public ResponseEntity> updateAssignedApplicationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedApplicationEnum status) { + + /** This code is responsible for creating user action logs for the "update assigned application status" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_ASSIGNED_APPLICATION_STATUS).build()); + + AssignedApplicationsResponse applicationResponse = assignedApplicationsService.updateAssignedApplicationStatus(request, assignedApplicationId, status); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6c824cbc..239efc0f 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -362,3 +362,4 @@ evaluation.form.deleted.successfully=Evaluation form deleted successfully. evaluation.form.fetched.successfully=Evaluation form fetched successfully. evaluation.form.not.found=Evaluation form not found. +assigned.application.status.updated.successfully=Assigned application status updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index cca4b808..3d37c00c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -352,3 +352,6 @@ evaluation.form.deleted.successfully=Modulo di valutazione eliminato con success evaluation.form.fetched.successfully=Modulo di valutazione recuperato con successo. evaluation.form.not.found=Modulo di valutazione non trovato. + +assigned.application.status.updated.successfully=Stato dell'applicazione assegnata aggiornato con successo. + From 9d8757b384973aa12f3bdde3ba1c1677610e2d86 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 27 Jan 2025 18:24:09 +0530 Subject: [PATCH 36/81] Updated code for pdf --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index ec7b53da..8be69097 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -340,7 +340,8 @@ public class PdfDao { for (String key : orderedKeys) { if (stateFieldMap.containsKey(key)) { // Only add data cell if key is in stateFieldMap Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - String fieldValue= (String) value; +// String fieldValue= (String) value; + String fieldValue = value != null ? value.toString() : ""; if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } From 15bf2e4d4a8f7bce35b5ceb81d105b55d294952c Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 27 Jan 2025 19:11:16 +0530 Subject: [PATCH 37/81] Done ticket GEPAFINBE-150 --- .../dao/AssignedApplicationsDao.java | 12 +++++++++--- .../service/AssignedApplicationsService.java | 4 +++- .../impl/AssignedApplicationsServiceImpl.java | 6 ++++-- .../web/rest/api/AssignedApplicationsApi.java | 5 ++++- .../api/impl/AssignedApplicationsController.java | 6 ++++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index c8e45af4..d1119e51 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -226,7 +226,7 @@ public class AssignedApplicationsDao { log.info("Assigned Application deleted with ID: {}", id); } - public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + public List getAllAssignedApplications(HttpServletRequest request, Long userId,List statusList) { UserEntity user = validator.validateUser(request); if(validator.checkIsPreInstructor() && userId == null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); @@ -234,18 +234,24 @@ public class AssignedApplicationsDao { if(userId != null) { validator.validatePreInstructor(request, userId); } - Specification spec = search(user.getHub().getId() ,userId); + Specification spec = search(user.getHub().getId() ,userId,statusList); List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); return assignedApplicationsEntityList.stream() .map(entity -> convertEntityToResponse(entity)) .collect(Collectors.toList()); } - private Specification search(Long hubId, Long userId) { + private Specification search(Long hubId, Long userId,List statusList) { return (root, query, builder) -> { Predicate predicate = builder.isFalse(root.get("isDeleted")); if (userId != null) { predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); } + if (statusList != null && !statusList.isEmpty()) { + List statusNames = statusList.stream() + .map(Enum::name) + .collect(Collectors.toList()); + predicate = builder.and(predicate, root.get("status").in(statusNames)); + } query.orderBy( builder.desc(builder.isNotNull(root.get(GepafinConstant.ASSIGNED_AT))), builder.desc(root.get(GepafinConstant.ASSIGNED_AT)) diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java index 1a73c674..5d9df4f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -2,6 +2,8 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -15,7 +17,7 @@ public interface AssignedApplicationsService { void deleteApplication(HttpServletRequest request, Long id); - List getAllAssignedApplications(HttpServletRequest request, Long userId); + List getAllAssignedApplications(HttpServletRequest request, Long userId,List statusList); AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, UpdateAssignedApplicationRequest assignedApplicationsRequest); AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java index c820d929..b6d68807 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -4,6 +4,8 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.AssignedApplicationsDao; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -40,8 +42,8 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ @Override @Transactional(readOnly = true) - public List getAllAssignedApplications(HttpServletRequest request, Long userId) { - return assignedApplicationsDao.getAllAssignedApplications(request, userId); + public List getAllAssignedApplications(HttpServletRequest request, Long userId,List statusList) { + return assignedApplicationsDao.getAllAssignedApplications(request, userId,statusList); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java index 144a20f4..a2742e07 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -6,6 +6,8 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -66,7 +68,8 @@ public interface AssignedApplicationsApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, - @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId, + @Parameter(description = "Assigned application statuses" ,required = false) @RequestParam(value = "statuses",required = false) List statusList); @Operation(summary = "Api to update assigned application", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java index 78cc47dd..ceaea428 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -4,6 +4,8 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; @@ -56,12 +58,12 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { } @Override - public ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, Long userId) { + public ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, Long userId,List statusList) { log.info("Get All Assigned Applications"); /** This code is responsible for creating user action logs for the "get Assigned Applications" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_ASSIGNED_APPLICATION).build()); - List applications = assignedApplicationsService.getAllAssignedApplications(request, userId); + List applications = assignedApplicationsService.getAllAssignedApplications(request, userId,statusList); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } From 73715b4edfc6c2badc0d03622952770846a7af12 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 28 Jan 2025 13:08:34 +0530 Subject: [PATCH 38/81] Done ticket GEPAFINBE-145 --- .../tendermanagement/dao/DashboardDao.java | 99 +++++++++++++++++-- .../enums/UserActionContextEnum.java | 1 + .../model/response/ApplicationToConsider.java | 15 +++ .../model/response/AverageEvaluationTime.java | 15 +++ .../model/response/EvaluatedApplication.java | 15 +++ .../PreInstructorWidgetResponseBean.java | 20 ++++ .../response/RescueInstructorInProgress.java | 13 +++ ...ApplicationAmendmentRequestRepository.java | 16 +++ .../repositories/ApplicationRepository.java | 15 +++ .../AssignedApplicationsRepository.java | 18 ++++ .../service/DashboardService.java | 6 +- .../service/impl/DashboardServiceImpl.java | 10 +- .../web/rest/api/DashboardApi.java | 19 +++- .../rest/api/impl/DashboardApiController.java | 16 ++- 14 files changed, 255 insertions(+), 23 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AverageEvaluationTime.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/EvaluatedApplication.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/PreInstructorWidgetResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/RescueInstructorInProgress.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 1f17ef3e..273e60b4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -6,10 +6,7 @@ import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; -import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; @@ -23,9 +20,7 @@ import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.temporal.ChronoUnit; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -362,5 +357,95 @@ public class DashboardDao { } } + private PreInstructorWidgetResponseBean initializeDashboardPreInstructorResponseBean() { + return PreInstructorWidgetResponseBean.builder() + .assignedApplication(ApplicationToConsider.builder() + .totalAssignedApplication(0L) + .additionalApplication(BigDecimal.ZERO) + .build()) + .evaluatedApplication(EvaluatedApplication.builder() + .evaluatedApplication(0L) + .dailyAverage(BigDecimal.ZERO) + .build()) + .averageEvaluationDays(AverageEvaluationTime.builder() + .averageEvlauationDaysRating(BigDecimal.ZERO) + .timeDifferenceFromAverage(BigDecimal.ZERO) + .build()) + .amendmentInProgress(RescueInstructorInProgress.builder() + .totalAmendmentInProgress(0L) + .expiringToday(0L) + .build()) + .build(); + } + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(UserEntity userEntity) { + PreInstructorWidgetResponseBean preInstructorWidgetResponseBean = initializeDashboardPreInstructorResponseBean(); + Long hubId = userEntity.getHub().getId(); + List applicationIds = getApplicationIdsForUserOrHub(userEntity, hubId); + setPreInstructorWidgets(applicationIds, preInstructorWidgetResponseBean,hubId); + calculateAverageEvaluationTime(applicationIds, preInstructorWidgetResponseBean, hubId); + return preInstructorWidgetResponseBean; + } + private void setPreInstructorWidgets(List applicationIds, PreInstructorWidgetResponseBean responseBean,Long hubId) { + + Long totalAssignedApplications = assignedApplicationsRepository.countAssignedApplicationsByApplicationIds(applicationIds); + if (totalAssignedApplications != null) { + responseBean.getAssignedApplication().setTotalAssignedApplication(totalAssignedApplications); + } + LocalDateTime yesterday = LocalDateTime.now().minusDays(1); + + Long newApplicationsAddedYesterday = assignedApplicationsRepository.countApplicationsAddedYesterdayForHub(hubId, yesterday); + if (newApplicationsAddedYesterday != null && totalAssignedApplications != null && totalAssignedApplications > 0) { + BigDecimal percentageAdded = BigDecimal.valueOf(newApplicationsAddedYesterday) + .divide(BigDecimal.valueOf(totalAssignedApplications), 4, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + responseBean.getAssignedApplication().setAdditionalApplication(percentageAdded.setScale(2, RoundingMode.HALF_UP)); + } + + List statuses = Arrays.asList(ApplicationStatusTypeEnum.APPROVED.getValue(), ApplicationStatusTypeEnum.REJECTED.getValue()); + LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7); + Long evaluatedApplication = applicationRepository.countEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); + if (evaluatedApplication != null) { + responseBean.getEvaluatedApplication().setEvaluatedApplication(evaluatedApplication); + + BigDecimal dailyAverage = applicationRepository.countDailyAverageEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); + if (dailyAverage != null) { + responseBean.getEvaluatedApplication().setDailyAverage(dailyAverage.setScale(2, RoundingMode.HALF_UP)); // Rounded to 2 decimal places + } + } + + Long rescueInstructorsInProgress = applicationRepository.countApplicationsByIdsAndStatus(applicationIds, ApplicationStatusTypeEnum.SOCCORSO.getValue()); + if (rescueInstructorsInProgress != null) { + responseBean.getAmendmentInProgress().setTotalAmendmentInProgress(rescueInstructorsInProgress); + } + calculateExpiringRescueInstructorsToday(applicationIds,responseBean); + + } + private void calculateExpiringRescueInstructorsToday(List applicationIds, PreInstructorWidgetResponseBean responseBean) { + List statuses =Arrays.asList( ApplicationAmendmentRequestEnum.AWAITING.getValue(), ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + + LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay(); + + LocalDateTime endOfDay = startOfDay.plusDays(1).minusNanos(1); + + Long expiringToday = applicationAmendmentRequestRepository.countAmendmentsExpiringToday(applicationIds, statuses, startOfDay, endOfDay); + + if (expiringToday != null) { + responseBean.getAmendmentInProgress().setExpiringToday(expiringToday); + } + } + + private void calculateAverageEvaluationTime(List applicationIds, PreInstructorWidgetResponseBean responseBean, Long hubId) { + + if (Boolean.FALSE.equals(applicationIds.isEmpty())) { + BigDecimal averageTime = applicationEvaluationRepository.findAverageEvaluationTimeByApplicationIds(applicationIds); + responseBean.getAverageEvaluationDays().setAverageEvlauationDaysRating( + averageTime != null ? averageTime.setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) + ); + +// +// BigDecimal timeDifference = applicationEvaluationRepository.findTimeDifferenceFromAverage(applicationIds); +// responseBean.getAverageEvaluationTime().setTimeDifferenceFromAverage(timeDifference != null ? timeDifference : BigDecimal.ZERO); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 64fd530c..7aaea7b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -138,6 +138,7 @@ public enum UserActionContextEnum { GET_DASHBOARD_WIDGET_FOR_BENEFICIARY("GET_DASHBOARD_WIDGET_FOR_BENEFICIARY"), GET_APPLICATION_DETAILS("GET_APPLICATION_DETAILS"), GET_AMENDMENT_DETAILS("GET_AMENDMENT_DETAILS"), + GET_DASHBOARD_WIDGET_FOR_PRE_INSTRUCTOR("GET_DASHBOARD_WIDGET_FOR_PRE_INSTRUCTOR"), /** Evaluation criteria action context **/ GET_EVALUATION_CRITERIA("GET_EVALUATION_CRITERIA"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java new file mode 100644 index 00000000..c417403c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Builder +@Data +public class ApplicationToConsider { + + public Long totalAssignedApplication; + + private BigDecimal additionalApplication; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AverageEvaluationTime.java b/src/main/java/net/gepafin/tendermanagement/model/response/AverageEvaluationTime.java new file mode 100644 index 00000000..0715d7e8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AverageEvaluationTime.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Builder +@Data +public class AverageEvaluationTime { + + private BigDecimal averageEvlauationDaysRating; + + private BigDecimal timeDifferenceFromAverage; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluatedApplication.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluatedApplication.java new file mode 100644 index 00000000..50df2089 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluatedApplication.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Builder +@Data +public class EvaluatedApplication { + + public Long evaluatedApplication; + + private BigDecimal dailyAverage; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/PreInstructorWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/PreInstructorWidgetResponseBean.java new file mode 100644 index 00000000..579d4df5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/PreInstructorWidgetResponseBean.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Builder +@Data +public class PreInstructorWidgetResponseBean { + + private ApplicationToConsider assignedApplication; + + private EvaluatedApplication evaluatedApplication; + + private AverageEvaluationTime averageEvaluationDays; + + private RescueInstructorInProgress amendmentInProgress; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RescueInstructorInProgress.java b/src/main/java/net/gepafin/tendermanagement/model/response/RescueInstructorInProgress.java new file mode 100644 index 00000000..ec8502e1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RescueInstructorInProgress.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class RescueInstructorInProgress { + + private Long totalAmendmentInProgress; + + private Long expiringToday; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 3e25f4a7..422a5730 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -132,4 +132,20 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository= :startOfDay + AND e.start_date + INTERVAL '1 DAY' * e.response_days < :endOfDay + AND e.is_deleted = false +""", nativeQuery = true) + Long countAmendmentsExpiringToday( + @Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("startOfDay") LocalDateTime startOfDay, + @Param("endOfDay") LocalDateTime endOfDay + ); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 086b0807..0a5fa214 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -8,6 +8,8 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -91,6 +93,19 @@ public interface ApplicationRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status = :status AND a.isDeleted = false") + Long countApplicationsByIdsAndStatus(@Param("applicationIds") List applicationIds, @Param("status") String status); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false AND a.updatedDate >= :sevenDaysAgo") + Long countEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); + + @Query("SELECT (COUNT(a) / 7.0) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false AND a.updatedDate >= :sevenDaysAgo") + BigDecimal countDailyAverageEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 56036759..6476f4b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -25,4 +26,21 @@ public interface AssignedApplicationsRepository extends JpaRepository findApplicationIdsByUserIdAndIsDeletedFalse(@Param("userId") Long userId); + + @Query("SELECT COUNT(a) FROM AssignedApplicationsEntity a WHERE a.application.id IN :applicationIds AND a.isDeleted = false") + Long countAssignedApplicationsByApplicationIds(@Param("applicationIds") List applicationIds); + + @Query(""" + SELECT COUNT(aa) + FROM AssignedApplicationsEntity aa + JOIN ApplicationEntity a ON aa.application.id = a.id + WHERE a.hubId = :hubId + AND a.isDeleted = false + AND aa.createdDate >= :yesterday +""") + Long countApplicationsAddedYesterdayForHub( + @Param("hubId") Long hubId, + @Param("yesterday") LocalDateTime yesterday + ); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java index ee7429d4..9a4d3e5f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java @@ -1,10 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; public interface DashboardService { @@ -13,4 +10,5 @@ public interface DashboardService { public BeneficiaryWidgetResponseBean getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId); public ApplicationWidgetResponseBean getApplicationDetails(HttpServletRequest request); public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request); + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index e157d293..3bc041b6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -4,10 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DashboardDao; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.DashboardService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; @@ -45,4 +42,9 @@ public class DashboardServiceImpl implements DashboardService { UserEntity userEntity=validator.validateUser(request); return dashboardDao.getAmendmentDetails(userEntity); } + @Override + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request) { + UserEntity userEntity=validator.validateUser(request); + return dashboardDao.getDashboardWidgetForPreInstructor(userEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java index bf1779fc..9c313f4a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java @@ -6,10 +6,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -75,4 +72,18 @@ public interface DashboardApi { produces = { "application/json" }) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") ResponseEntity> getAmendmentDetails(HttpServletRequest request); + + @Operation(summary = "Api to get dashboard widget for pre instructor", + 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 = "/instructor/amendment", + produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") + ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java index c9bc0d85..8bf02ec9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java @@ -6,10 +6,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.DashboardService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -71,4 +68,15 @@ public class DashboardApiController implements DashboardApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } + + @Override + public ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request) { + + /** This code is responsible for creating user action logs for the "Get dashboard stats widget for amendment page" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_DASHBOARD_WIDGET_FOR_PRE_INSTRUCTOR).build()); + + PreInstructorWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForPreInstructor(request); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); + } } From a6d86445928a854f894916ba607a91857dcc9f79 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 28 Jan 2025 17:50:22 +0530 Subject: [PATCH 39/81] Added application evaluation form and form field --- .../tendermanagement/dao/ApplicationDao.java | 2 +- .../dao/ApplicationEvaluationDao.java | 233 +++++++++++++++++- .../ApplicationEvaluationFormEntity.java | 22 ++ .../ApplicationEvaluationFormFieldEntity.java | 24 ++ .../enums/UserActionContextEnum.java | 1 + ...icationEvaluationFormFieldReponseBean.java | 15 ++ .../ApplicationEvaluationResponseBean.java | 15 ++ ...licationEvaluationFormFieldRepository.java | 18 ++ .../ApplicationEvaluationFormRepository.java | 19 ++ .../service/ApplicationEvaluationService.java | 5 + .../ApplicationEvaluationServiceImpl.java | 9 + .../rest/api/ApplicationEvaluationApi.java | 19 ++ .../ApplicationEvaluationApiController.java | 16 ++ .../db/changelog/db.changelog-1.0.0.xml | 57 ++++- 14 files changed, 449 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormFieldReponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 174313ca..794e7796 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -669,7 +669,7 @@ public class ApplicationDao { return documentIds; } - private List validateDocumentIds(String documentId) { + public List validateDocumentIds(String documentId) { if (documentId != null && !documentId.isEmpty()) { return Arrays.stream(documentId.split(",")) .map(Long::parseLong) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 74a14114..d19c8965 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -12,10 +12,7 @@ import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; -import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.LoggingUtil; -import net.gepafin.tendermanagement.util.Utils; -import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.util.*; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -25,6 +22,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.MessageFormat; import java.time.Duration; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -32,6 +30,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component @@ -116,6 +115,27 @@ public class ApplicationEvaluationDao { @Autowired private HubService hubService; + @Autowired + private EvaluationFormService evaluationFormService; + + @Autowired + private EvaluationFormDao evaluationFormDao; + + @Autowired + private ApplicationEvaluationFormRepository applicationEvaluationFormRepository; + + @Autowired + private ApplicationEvaluationFormFieldRepository applicationEvaluationFormFieldRepository; + + @Autowired + private ApplicationDao applicationDao; + + @Autowired + private ApplicationEvaluationService applicationEvaluationService; + + @Autowired + private CallDao callDao; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -1907,5 +1927,210 @@ public class ApplicationEvaluationDao { loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluation).newData(savedEntity).build()); return convertToResponse(savedEntity); } + + public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationFormId, Long evaluationId){ + EvaluationFormEntity evaluationFormEntity = evaluationFormService.validateEvaluationForm(evaluationFormId); + validateFormFields(applicationRequestBean,evaluationFormEntity); + ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(evaluationId); + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,applicationEvaluationEntity); + createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); + return getEvaluationById(applicationEvaluationEntity.getId(),evaluationFormEntity.getId()); + } + + private ApplicationEvaluationFormEntity getApplicationEvaluationFormOrCreate(EvaluationFormEntity evaluationFormEntity, ApplicationEvaluationEntity applicationEvaluationEntity) { + + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = applicationEvaluationFormRepository.findByEvaluationIdAndEvaluationFormId(applicationEvaluationEntity.getId(), evaluationFormEntity.getId()); + ApplicationEvaluationFormEntity oldApplicationEvaluationFormEntity = Utils.getClonedEntityForData(applicationEvaluationFormEntity); + if (applicationEvaluationFormEntity == null) { + applicationEvaluationFormEntity = createApplicationEvaluationFormEntity(applicationEvaluationEntity, evaluationFormEntity); + + /** This code is responsible for adding a version history log for the "Create application evalaution form" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldApplicationEvaluationFormEntity).newData(applicationEvaluationFormEntity) + .build()); + } + return applicationEvaluationFormEntity; + } + + public ApplicationEvaluationFormEntity createApplicationEvaluationFormEntity(ApplicationEvaluationEntity applicationEvaluationEntity, EvaluationFormEntity evaluationFormEntity) { + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = new ApplicationEvaluationFormEntity(); + applicationEvaluationFormEntity.setApplicationId(applicationEvaluationEntity.getApplicationId()); + applicationEvaluationFormEntity.setEvaluationForm(evaluationFormEntity); + applicationEvaluationFormEntity.setApplicationEvaluation(applicationEvaluationEntity); + applicationEvaluationFormEntity.setIsDeleted(false); + return saveApplicationEvaluationFormEntity(applicationEvaluationFormEntity); + } + + public void validateFormFields(ApplicationRequestBean request, EvaluationFormEntity evaluationFormEntity) { + + List contentResponseBeans=evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity).getContent(); + + List requestFields = request.getFormFields(); + + Map contentMap = contentResponseBeans.stream() + .collect(Collectors.toMap(ContentResponseBean::getId, ContentResponseBean::getLabel)); // Change getLabel() if needed + FieldValidator validator = FieldValidator.create(); + for (ApplicationFormFieldRequestBean requestField : requestFields) { + String fieldId = requestField.getFieldId(); + + if (!contentMap.containsKey(fieldId)) { + validator.addError(MessageFormat.format(Translator.toLocale(GepafinConstant.FIELD_ID_NOT_FOUND), fieldId)); + } + + } + validator.validate(); + } + + public ApplicationEvaluationFormEntity saveApplicationEvaluationFormEntity(ApplicationEvaluationFormEntity applicationEvaluationFormEntity) { + return applicationEvaluationFormRepository.save(applicationEvaluationFormEntity); + } + + public List createOrUpdateMultipleFormFields(List formFieldRequestBeans, + ApplicationEvaluationFormEntity applicationEvaluationFormEntity, EvaluationFormEntity evaluationFormEntity) { + + List existingFields = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormId(applicationEvaluationFormEntity.getId()); + + return formFieldRequestBeans.stream().map(requestBean -> createOrUpdateApplicationEvaluationFormField(requestBean, applicationEvaluationFormEntity, existingFields, evaluationFormEntity)) + .collect(Collectors.toList()); + } + + public ApplicationEvaluationFormFieldEntity createOrUpdateApplicationEvaluationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, + ApplicationEvaluationFormEntity applicationEvaluationFormEntity, + List applicationEvaluationFormFieldEntities, + EvaluationFormEntity evaluationFormEntity){ + ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = null; + validateFileUploadDocuments(applicationFormFieldRequestBean, evaluationFormEntity); + VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; + ApplicationEvaluationFormFieldEntity oldApplicationEvaluationFormFieldData = null; + if (applicationEvaluationFormFieldEntities == null || applicationEvaluationFormFieldEntities.isEmpty()) { + applicationEvaluationFormFieldEntity = new ApplicationEvaluationFormFieldEntity(); + applicationEvaluationFormFieldEntity.setApplicationEvaluationForm(applicationEvaluationFormEntity); + applicationEvaluationFormFieldEntity.setIsDeleted(false); + }else{ + for (ApplicationEvaluationFormFieldEntity existingFieldEntity : applicationEvaluationFormFieldEntities) { + if (existingFieldEntity.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { + applicationEvaluationFormFieldEntity = existingFieldEntity; + oldApplicationEvaluationFormFieldData = Utils.getClonedEntityForData(existingFieldEntity); + actionType = VersionActionTypeEnum.UPDATE; + break; + } else { + applicationEvaluationFormFieldEntity.setApplicationEvaluationForm(applicationEvaluationFormEntity); + } + } + } + Utils.setIfUpdated(applicationEvaluationFormFieldEntity::getFieldId, applicationEvaluationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); + + if (applicationFormFieldRequestBean.getFieldValue() != null) { + applicationEvaluationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue())); + } else { + applicationEvaluationFormFieldEntity.setFieldValue(null); + } + + ApplicationEvaluationFormFieldEntity savedEvaluationFormFieldEntity = applicationEvaluationFormFieldRepository.save(applicationEvaluationFormFieldEntity); + + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationEvaluationFormFieldData).newData(savedEvaluationFormFieldEntity).build()); + + log.info("Version history logged for action: {}, Field ID: {}", actionType, applicationEvaluationFormFieldEntity.getFieldId()); + + return savedEvaluationFormFieldEntity; + } + + private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, EvaluationFormEntity evaluationFormEntity) { + List documentIds=null; + + List contentResponseBeans=evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity).getContent(); + for (ContentResponseBean contentResponseBean:contentResponseBeans){ + if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))) { + if (contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { + Object fieldValueObject = applicationFormFieldRequestBean.getFieldValue(); + if (fieldValueObject instanceof String) { + // Safely cast the object to a string + String documentId = (String) fieldValueObject; + // Now you can use documentId as needed + documentIds = applicationDao.validateDocumentIds(documentId); + } + } + } + } + return documentIds; + } + + public ApplicationEvaluationResponseBean getEvaluationById(Long evaluationId, Long evaluationFormId){ + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(evaluationId); + + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = applicationEvaluationFormRepository.findByEvaluationIdAndEvaluationFormId(applicationEvaluationEntity.getId(),evaluationFormId); + List applicationEvaluationFormFieldEntities = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormId(applicationEvaluationFormEntity.getId()); + List evaluationFormFieldResponseBeans = createEvaluationFormFieldResponse(applicationEvaluationFormFieldEntities, applicationEvaluationFormEntity); + ApplicationEvaluationResponseBean applicationEvaluationResponseBean = convertApplicationEvaluationEntityToApplicationEvaluationResponseBean(applicationEvaluationEntity); + applicationEvaluationResponseBean.setFormFields(evaluationFormFieldResponseBeans); + + return applicationEvaluationResponseBean; + } + + private List createEvaluationFormFieldResponse( + List evaluationFormFieldEntities, + ApplicationEvaluationFormEntity applicationEvaluationFormEntity){ + List evaluationFormFieldResponseBeans = new ArrayList<>(); + List contentResponseBeans =evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(applicationEvaluationFormEntity.getEvaluationForm()).getContent(); + + for (ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity : evaluationFormFieldEntities) { + + Optional fileUploadContent = contentResponseBeans.stream() + .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) && + contentResponseBean.getId().equals(applicationEvaluationFormFieldEntity.getFieldId())) + .findFirst(); + + List documentResponseBeans = new ArrayList<>(); + if (fileUploadContent.isPresent()) { + String documentId = applicationEvaluationFormFieldEntity.getFieldValue(); + if (documentId != null && !documentId.isEmpty()) { + documentResponseBeans = Arrays.stream(documentId.split(",")) + .map(String::trim) + .map(Long::parseLong) + .map(docId -> { + DocumentEntity documentEntity = documentService.validateDocument(docId); +// if (Boolean.FALSE.equals(DocumentSourceTypeEnum.APPLICATION.getValue().equals(documentEntity.getSource()))) { +// throw new CustomValidationException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); +// } + return documentEntity; + }) + .map(callDao::convertToDocumentResponseBean) + .collect(Collectors.toList()); + } + } + ApplicationEvaluationFormFieldReponseBean responseBean = convertToEvaluationFormFieldResponseBean( + applicationEvaluationFormFieldEntity, applicationEvaluationFormEntity.getId()); + if (!documentResponseBeans.isEmpty()) { + responseBean.setFieldValue(documentResponseBeans); + } + evaluationFormFieldResponseBeans.add(responseBean); + } + return evaluationFormFieldResponseBeans; + + } + + private ApplicationEvaluationFormFieldReponseBean convertToEvaluationFormFieldResponseBean(ApplicationEvaluationFormFieldEntity entity,Long applicationEvaluationFormId){ + ApplicationEvaluationFormFieldReponseBean applicationEvaluationFormFieldReponseBean = new ApplicationEvaluationFormFieldReponseBean(); + applicationEvaluationFormFieldReponseBean.setApplicationEvaluationFormId(applicationEvaluationFormId); + applicationEvaluationFormFieldReponseBean.setFieldId(entity.getFieldId()); + if(entity.getFieldValue() != null) { + applicationEvaluationFormFieldReponseBean.setFieldValue(Utils.getFieldValueAsObject(entity.getFieldValue())); + } + applicationEvaluationFormFieldReponseBean.setId(entity.getId()); + applicationEvaluationFormFieldReponseBean.setCreatedDate(entity.getCreatedDate()); + applicationEvaluationFormFieldReponseBean.setUpdatedDate(entity.getUpdatedDate()); + return applicationEvaluationFormFieldReponseBean; + } + + private ApplicationEvaluationResponseBean convertApplicationEvaluationEntityToApplicationEvaluationResponseBean(ApplicationEvaluationEntity entity){ + ApplicationEvaluationResponseBean response = new ApplicationEvaluationResponseBean(); + response.setId(entity.getId()); + response.setApplicationId(entity.getApplicationId()); + response.setEvaluationId(entity.getId()); + response.setNote(entity.getNote()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java new file mode 100644 index 00000000..251fb262 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Data +@Table(name = "APPLICATION_EVALUATION_FORM") +public class ApplicationEvaluationFormEntity extends BaseEntity{ + private Long applicationId; + + @Column(name="IS_DELETED") + private Boolean isDeleted; + + @ManyToOne + @JoinColumn(name = "EVALUATION_ID") + private ApplicationEvaluationEntity applicationEvaluation; + + @ManyToOne + @JoinColumn(name = "EVALUATION_FORM_ID") + private EvaluationFormEntity evaluationForm; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java new file mode 100644 index 00000000..913d8831 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Data +@Table(name = "APPLICATION_EVALUATION_FORM_FIELD") +public class ApplicationEvaluationFormFieldEntity extends BaseEntity { + + @ManyToOne + @JoinColumn(name = "APPLICATION_EVALUATION_FORM_ID") + private ApplicationEvaluationFormEntity applicationEvaluationForm; + + @Column(name = "FIELD_ID") + private String fieldId; + + @Column(name = "FIELD_VALUE") + private String fieldValue; + + @Column(name="IS_DELETED") + private Boolean isDeleted; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 76bed042..9a5dd397 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -97,6 +97,7 @@ public enum UserActionContextEnum { CREATE_UPDATE_APPLICATION_EVALUATION("CREATE_UPDATE_APPLICATION_EVALUATION"), GET_APPLICATION_EVALUATION("GET_APPLICATION_EVALUATION"), DELETE_APPLICATION_EVALUATION("DELETE_APPLICATION_EVALUATION"), + CREATE_UPDATE_APPLICATION_EVALUATION_FORM("CREATE_UPDATE_APPLICATION_EVALUATION_FORM"), /** Beneficiary Preferred Call action context **/ CREATE_BENEFICIARY_PREFERRED_CALL("CREATE_BENEFICIARY_PREFERRED_CALL"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormFieldReponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormFieldReponseBean.java new file mode 100644 index 00000000..62a0aa82 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormFieldReponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class ApplicationEvaluationFormFieldReponseBean extends BaseBean { + private Long id; + + private Long applicationEvaluationFormId; + + private String fieldId; + + private Object fieldValue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java new file mode 100644 index 00000000..cf4b5865 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.util.List; + +@Data +public class ApplicationEvaluationResponseBean extends BaseBean { + private Long applicationId; + private Long evaluationId; + private String note; + private List formFields; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java new file mode 100644 index 00000000..07a0d318 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationEvaluationFormFieldEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ApplicationEvaluationFormFieldRepository extends JpaRepository { + @Query("SELECT f FROM ApplicationEvaluationFormFieldEntity f " + + "WHERE f.applicationEvaluationForm.id = :applicationEvaluationFormId " + + "AND f.isDeleted = false") + List findByApplicationEvaluationFormId( + @Param("applicationEvaluationFormId") Long applicationEvaluationFormId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java new file mode 100644 index 00000000..4514205b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationEvaluationFormEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ApplicationEvaluationFormRepository extends JpaRepository { + + @Query("SELECT a FROM ApplicationEvaluationFormEntity a " + + "WHERE a.applicationEvaluation.id = :evaluationId " + + "AND a.evaluationForm.id = :evaluationFormId " + + "AND a.isDeleted = false") + ApplicationEvaluationFormEntity findByEvaluationIdAndEvaluationFormId( + @Param("evaluationId") Long evaluationId, + @Param("evaluationFormId") Long evaluationFormId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 454030af..682e2999 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -3,8 +3,11 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import java.util.List; @@ -21,4 +24,6 @@ public interface ApplicationEvaluationService { ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId); + ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 3dd9035f..604d5fd5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -7,9 +7,11 @@ import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.AssignedApplicationsService; @@ -78,4 +80,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe return applicationEvaluationDao.validateApplicationEvaluationByApplicationId(applicationId); } + @Override + public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId) { + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(evaluationId); + validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); + return applicationEvaluationDao.createApplicationEvaluation(request,applicationRequestBean,evaluationFormId,evaluationId); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 9d168955..19b3170c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -8,8 +8,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -56,4 +59,20 @@ public interface ApplicationEvaluationApi { @Parameter( required = true) @PathVariable("id") Long id); + @Operation(summary = "Api to create or update application evaluation form ( Evaluation V2 )", + 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) })) }) + @PutMapping(value = "/{evaluationId}/form", + produces = { "application/json" }) + ResponseEntity> createApplicationEvaluation(HttpServletRequest request, + @Valid @RequestBody ApplicationRequestBean applicationRequestBean, + @Parameter(description = "The evaluation id", required = true) @PathVariable(value = "evaluationId", required = true) Long evaluationId, + @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index b299ecc2..cffaa7f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -6,9 +6,12 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.model.response.EvaluationDocumentResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; @@ -83,4 +86,17 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); } + @Override + public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId) { + + /** This code is responsible for creating user action logs for the "Create or update application evaluation form" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_EVALUATION_FORM).build()); + + ApplicationEvaluationResponseBean applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationRequestBean, evaluationId, evaluationFormId); + + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(applicationEvaluationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); + } + } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index b987fd7c..f357b08b 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2303,7 +2303,62 @@ EXISTS (SELECT 1 FROM application_evaluation ae WHERE ae.application_id = application.id) - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 71c1b4949d852da6e57e39584cd65d8ee9024a86 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 28 Jan 2025 18:27:38 +0530 Subject: [PATCH 40/81] updated code --- .../web/rest/api/ApplicationEvaluationApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 19b3170c..8fe0c4ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -68,11 +68,11 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/{evaluationId}/form", + @PutMapping(value = "/{id}/form", produces = { "application/json" }) ResponseEntity> createApplicationEvaluation(HttpServletRequest request, @Valid @RequestBody ApplicationRequestBean applicationRequestBean, - @Parameter(description = "The evaluation id", required = true) @PathVariable(value = "evaluationId", required = true) Long evaluationId, + @Parameter(description = "The evaluation id", required = true) @PathVariable(value = "id", required = true) Long id, @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); } From b274cd672b161a2f3cbfe3604daf05e90e7d5e93 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 28 Jan 2025 18:43:39 +0530 Subject: [PATCH 41/81] Done ticket GEPAFINBE-151 --- .../impl/ApplicationAmendmentRequestServiceImpl.java | 1 - .../web/rest/api/ApplicationAmendmentRequestApi.java | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index e2615a71..0d44c22b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -84,7 +84,6 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm @Override public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { - UserEntity user = validator.validatePreInstructor(request, userId); return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(request,userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 0918b918..1f1ca862 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -18,6 +18,7 @@ import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -85,9 +86,10 @@ public interface ApplicationAmendmentRequestApi { @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 = "/user/{id}", produces = "application/json") + @GetMapping(value = "/user", produces = "application/json") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request, - @Parameter(description = "The User ID", required = false) @PathVariable(value = "id",required = false) Long userId); + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); @Operation(summary = "Api to update application amendment", responses = { From 19d7bf5e26ed94f59ad80475d8fc8b95384a2ade Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 28 Jan 2025 19:24:39 +0530 Subject: [PATCH 42/81] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 35 +++++++++++++++++-- .../response/GetAllAmendmentResponseBean.java | 30 ++++++++++++++++ .../ApplicationAmendmentRequestService.java | 3 +- ...pplicationAmendmentRequestServiceImpl.java | 3 +- .../api/ApplicationAmendmentRequestApi.java | 5 +-- ...ApplicationAmendmentRequestController.java | 5 +-- 6 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/GetAllAmendmentResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 5693193c..0e138227 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -592,7 +592,7 @@ public class ApplicationAmendmentRequestDao { return response; } - public List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { + public List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { if (validator.checkIsPreInstructor() && userId == null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); } @@ -604,7 +604,7 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestRepository.findAll(spec); return applicationAmendmentRequestEntities.stream() - .map(entity -> convertEntityToResponse(entity, false)) + .map(this::initializeGetAllBasicResponse) .collect(Collectors.toList()); } @@ -1178,6 +1178,37 @@ public class ApplicationAmendmentRequestDao { return applicationEvaluation; + } + + private GetAllAmendmentResponseBean initializeGetAllBasicResponse(ApplicationAmendmentRequestEntity entity) { + GetAllAmendmentResponseBean response = new GetAllAmendmentResponseBean(); + ApplicationEntity applicationEntity = entity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication(); + response.setId(entity.getId()); + response.setApplicationId(entity.getApplicationId()); + response.setApplicationEvaluationId(entity.getApplicationEvaluationEntity().getId()); + response.setNote(entity.getNote()); + response.setStatus(ApplicationAmendmentRequestEnum.valueOf(entity.getStatus())); + response.setResponseDays(entity.getResponseDays()); + response.setInternalNote(entity.getInternalNote()); + + LocalDateTime startDate = entity.getStartDate(); + response.setStartDate(startDate); + response.setExpirationDate(entity.getEndDate()); + response.setEvaluationEndDate(entity.getApplicationEvaluationEntity().getEndDate()); + response.setIsSendEmail(entity.getIsEmail()); + response.setIsSendNotification(entity.getIsNotification()); + + ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId()); + response.setCallEmail(application.getCall().getEmail()); + response.setCallName(application.getCall().getName()); + + UserEntity userEntity = userService.validateUser(application.getUserId()); + response.setBeneficiaryName(buildBeneficiaryName(userEntity)); + CompanyEntity company = companyService.validateCompany(application.getCompanyId()); + response.setCompanyName(company.getCompanyName()); + Long protocolNumber = entity.getProtocol() != null ? entity.getProtocol().getProtocolNumber() : null; + response.setProtocolNumber(protocolNumber); + return response; } private void softDeleteDocument(Long documentId) { documentService.deleteFile(documentId); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/GetAllAmendmentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/GetAllAmendmentResponseBean.java new file mode 100644 index 00000000..7a0d8f93 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/GetAllAmendmentResponseBean.java @@ -0,0 +1,30 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class GetAllAmendmentResponseBean { + private Long id; + private String callEmail; + private String note; + private Long responseDays; + private LocalDateTime startDate; + private Boolean isSendNotification; + private Boolean isSendEmail; + private Long protocolNumber; + private String callName; + private String beneficiaryName; + private String companyName; + private String amendmentNotes; + private Long applicationId; + private Long applicationEvaluationId; + private LocalDateTime evaluationEndDate; + private LocalDateTime expirationDate; + private String internalNote; + private ApplicationAmendmentRequestEnum status; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 678ff913..5c664327 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; import java.util.List; @@ -16,7 +17,7 @@ public interface ApplicationAmendmentRequestService { public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest); void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id); ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id); - List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId); + List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId); ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 0d44c22b..cb8b5043 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -12,6 +12,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; @@ -83,7 +84,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override - public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { + public List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(request,userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 1f1ca862..e0880127 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBea import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -88,8 +89,8 @@ public interface ApplicationAmendmentRequestApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/user", produces = "application/json") @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") - ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request, - @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); + ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request, + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); @Operation(summary = "Api to update application amendment", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index d4707511..d00a8df0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -12,6 +12,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBea import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.response.GetAllAmendmentResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -85,14 +86,14 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme } @Override - public ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { + public ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { log.info("Get All Applications Amendment Request"); /** This code is responsible for creating user action logs for the "get all application amendment by preInstructor user id" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID).build()); - List applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request,userId); + List applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request,userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentRequestResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } From 65dea832d0dfda0b2da4dfda968de75afc3fe20f Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 29 Jan 2025 12:34:57 +0530 Subject: [PATCH 43/81] Done ticket GEPAFINBE-146 --- .../constants/GepafinConstant.java | 2 ++ .../impl/CallValidatorServiceImpl.java | 33 ++++++++++++++++--- src/main/resources/message_en.properties | 4 +++ src/main/resources/message_it.properties | 4 +++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8e2828e5..3170aafd 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -403,5 +403,7 @@ public class GepafinConstant { public static final String EVALUATION_V2_STEP_2 = "EVALUATION_V2_STEP_2"; public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; + + public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java index eaa3ba13..4c54f042 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallValidatorServiceImpl.java @@ -7,10 +7,7 @@ import java.util.List; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; -import net.gepafin.tendermanagement.model.response.CallResponse; -import net.gepafin.tendermanagement.model.response.EvaluationFormResponseBean; -import net.gepafin.tendermanagement.model.response.FlowResponseBean; -import net.gepafin.tendermanagement.model.response.FormResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -61,6 +58,34 @@ public class CallValidatorServiceImpl { if (formResponses == null || formResponses.isEmpty()) { data.addError(Translator.toLocale(GepafinConstant.FORM_NOT_FOUND)); } + boolean isAmountRequestedValid = false; + if (formResponses != null && !formResponses.isEmpty()) { + outerloop: + for (FormResponseBean formResponse : formResponses) { + + if (formResponse.getContent() != null && !formResponse.getContent().isEmpty()) { + for (ContentResponseBean content : formResponse.getContent()) { + if ("numberinput".equals(content.getName()) && content.getSettings() != null) { + for (SettingResponseBean setting : content.getSettings()) { + if ("isRequestedAmount".equals(setting.getName())) { + Object value = setting.getValue(); + if (Boolean.TRUE.equals(value)) { + isAmountRequestedValid = true; + break outerloop; + } else if (value == null) { + data.addError(Translator.toLocale(GepafinConstant.REQUIRED_REQUESTED_AMOUNT_MSG)); + } + } + } + } + } + } + } + } + + if (!isAmountRequestedValid) { + data.addError(Translator.toLocale(GepafinConstant.REQUIRED_REQUESTED_AMOUNT_MSG)); + } data.validate(); } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 239efc0f..451dec92 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -363,3 +363,7 @@ evaluation.form.fetched.successfully=Evaluation form fetched successfully. evaluation.form.not.found=Evaluation form not found. assigned.application.status.updated.successfully=Assigned application status updated successfully. + +validation.required.requested.amount=The Requested Amount configuration should be mandatory. + + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 3d37c00c..66595c92 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -355,3 +355,7 @@ evaluation.form.not.found=Modulo di valutazione non trovato. assigned.application.status.updated.successfully=Stato dell'applicazione assegnata aggiornato con successo. +validation.required.requested.amount=La configurazione dell'importo richiesto č obbligatoria. + + + From 651ea9540a30af5b7512e583577c2b73ca26f411 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 29 Jan 2025 13:00:18 +0530 Subject: [PATCH 44/81] Fixed issue for evaluation expiration --- .../tendermanagement/dao/NotificationDao.java | 14 ++++++++++++++ .../ApplicationAmendmentRequestRepository.java | 4 ++-- .../ApplicationEvaluationRepository.java | 2 +- .../scheduler/ApplicationEvaluationScheduler.java | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 3944246c..275447ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -208,6 +208,20 @@ public class NotificationDao { } } + public void sendNotificationToInstructorManager(Map placeHolders, ApplicationEvaluationEntity applicationEvaluationEntity, NotificationTypeEnum notificationTypeEnum) { + + List userEntities=userRepository.findByRoleEntity_RoleTypeAndHubId(RoleStatusEnum.ROLE_INSTRUCTOR_MANAGER.getValue(),applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication().getHubId()); + for (UserEntity user:userEntities) { + Long instructorId=user.getId(); + ApplicationEntity application = applicationService.validateApplication(applicationEvaluationEntity.getApplicationId()); + if (instructorId != null) { + NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, instructorId, application.getUserWithCompany(), + null); + sendNotification(notificationreq); + } + } + } + public List getAllCompanyIdsForUser(Long userId) { return userWithCompanyRepository.findActiveCompanyIdsByUserId(userId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 3e25f4a7..0ec7d668 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -59,7 +59,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository 'CLOSE' " + + "AND a.status NOT IN('CLOSE','EXPIRED') " + "AND a.endDate < :currentTime") List findAmendmentsDueForExpiration(LocalDateTime currentTime); @@ -72,7 +72,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository 'CLOSE' " + + " AND activeAmendment.status NOT IN('CLOSE','EXPIRED') " + " AND activeAmendment.isDeleted = false) ") Set findEvaluationsWithoutActiveAmendmentsByIds(@Param("applicationEvaluationIds") Set applicationEvaluationIds); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 468a5a6f..c1329470 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -32,7 +32,7 @@ public interface ApplicationEvaluationRepository extends JpaRepository findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate); @Query("SELECT a FROM ApplicationEvaluationEntity a " + diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java index e7249645..c43aca10 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -90,7 +90,7 @@ public class ApplicationEvaluationScheduler { Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); - + notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); // Logging version history for the update operation loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest) From c2da8bee21171af685c8bb306f0d4087bc18b8ab Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 29 Jan 2025 14:37:34 +0530 Subject: [PATCH 45/81] Added an get API for application evaluation form --- .../constants/GepafinConstant.java | 3 + .../dao/ApplicationEvaluationDao.java | 55 +++++++++++++++++++ .../dao/EvaluationFormDao.java | 6 +- .../enums/UserActionContextEnum.java | 1 + .../ApplicationEvaluationFormResponse.java | 16 ++++++ ...ApplicationEvaluationFormResponseBean.java | 19 +++++++ .../ApplicationEvaluationFormRepository.java | 2 + .../ApplicationEvaluationRepository.java | 9 +++ ...ory.java => EvaluationFormRepository.java} | 3 +- .../service/ApplicationEvaluationService.java | 7 ++- .../ApplicationEvaluationServiceImpl.java | 13 +++++ .../rest/api/ApplicationEvaluationApi.java | 21 ++++++- .../ApplicationEvaluationApiController.java | 18 ++++-- src/main/resources/message_en.properties | 3 + src/main/resources/message_it.properties | 3 + 15 files changed, 162 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponseBean.java rename src/main/java/net/gepafin/tendermanagement/repositories/{EvalualtionFormRepository.java => EvaluationFormRepository.java} (76%) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6b5a9c3e..6b03299d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -237,6 +237,7 @@ public class GepafinConstant { public static final String EVALUATION_UPDATED_SUCCESSFULLY = "evaluation.updated.successfully"; public static final String EVALUATION_FETCHED_SUCCESSFULLY = "evaluation.fetched.successfully"; public static final String EVALUATION_DELETED_SUCCESSFULLY = "evaluation.deleted.successfully"; + public static final String GET_APPLICATION_EVALUATION_FORM_SUCCESS_MSG = "application.evaluation.form.get.success"; public static final String EVALUATIONS_FETCHED_SUCCESSFULLY = "evaluations.fetched.successfully"; public static final String APPLICATION_EVALUATION_NOT_FOUND = "application.evaluation.not.found"; public static final String APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY = "application.evaluation.status.updated.successfully"; @@ -401,5 +402,7 @@ public class GepafinConstant { public static final String EVALUATION_FORM_NOT_FOUND = "evaluation.form.not.found"; public static final String EVALUATION_V2_STEP_2 = "EVALUATION_V2_STEP_2"; + + public static final String EITHER_APPLICATION_ID_OR_ASSIGNED_APPLICATION_ID_MUST_BE_PROVIDED = "either.applicationId.or.assignedApplicationId.must.be.provided"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index d19c8965..edb69587 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -136,6 +136,9 @@ public class ApplicationEvaluationDao { @Autowired private CallDao callDao; + @Autowired + private EvaluationFormRepository evaluationFormRepository; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -2132,5 +2135,57 @@ public class ApplicationEvaluationDao { response.setUpdatedDate(entity.getUpdatedDate()); return response; } + + public ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId ){ + + if (applicationId == null && assignedApplicationId == null) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.EITHER_APPLICATION_ID_OR_ASSIGNED_APPLICATION_ID_MUST_BE_PROVIDED)); + } + + ApplicationEvaluationEntity evaluationEntity = applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationId(applicationId, assignedApplicationId); + + return (evaluationEntity != null) ? processEvaluationForm(evaluationEntity) : null; + } + + private ApplicationEvaluationFormResponse processEvaluationForm(ApplicationEvaluationEntity evaluationEntity){ + ApplicationEvaluationFormResponse response = new ApplicationEvaluationFormResponse(); + response.setApplicationId(evaluationEntity.getApplicationId()); + response.setNote(evaluationEntity.getNote()); + response.setStatus(evaluationEntity.getStatus()); + response.setAssignedApplicationId(evaluationEntity.getAssignedApplicationsEntity().getId()); + + EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByCallIdAndIsDeletedFalse(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId()); + + if (evaluationFormEntity != null) { + response.setEvaluationFormId(evaluationFormEntity.getId()); + response.setApplicationEvaluationFormResponse(convertEvaluationFormToResponse(evaluationFormEntity, evaluationEntity)); + } + + return response; + } + + private ApplicationEvaluationFormResponseBean convertEvaluationFormToResponse(EvaluationFormEntity evaluationForm, ApplicationEvaluationEntity applicationEvaluationEntity) { + ApplicationEvaluationFormResponseBean applicationEvaluationFormResponseBean = createEvaluationFormResponse(evaluationForm); + + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = applicationEvaluationFormRepository.findByEvaluationIdAndEvaluationFormId(applicationEvaluationEntity.getId(), evaluationForm.getId()); + + if(applicationEvaluationFormEntity!=null) { + List applicationEvaluationFormFieldEntities = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormId(applicationEvaluationFormEntity.getId()); + List evaluationFormFieldResponseBeans = createEvaluationFormFieldResponse(applicationEvaluationFormFieldEntities, applicationEvaluationFormEntity); + applicationEvaluationFormResponseBean.setFormFields(evaluationFormFieldResponseBeans); + } + + return applicationEvaluationFormResponseBean; + } + + private ApplicationEvaluationFormResponseBean createEvaluationFormResponse(EvaluationFormEntity evaluationFormEntity) { + ApplicationEvaluationFormResponseBean evaluationFormResponseBean = new ApplicationEvaluationFormResponseBean(); + evaluationFormResponseBean.setId(evaluationFormEntity.getId()); + evaluationFormResponseBean.setLabel(evaluationFormEntity.getLabel()); + evaluationFormResponseBean.setCallId(evaluationFormEntity.getCall().getId()); + evaluationFormResponseBean.setContent(evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity).getContent()); + return evaluationFormResponseBean; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java index 594aa24d..e5361e83 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationFormDao.java @@ -21,17 +21,13 @@ package net.gepafin.tendermanagement.dao; import org.springframework.stereotype.Component; import java.time.LocalDateTime; - import java.util.Collections; import java.util.List; - import java.util.Optional; - import java.util.Set; - import java.util.stream.Collectors; @Component public class EvaluationFormDao { @Autowired - private EvalualtionFormRepository evaluationFormRepository; + private EvaluationFormRepository evaluationFormRepository; @Autowired private CallDao callDao; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 9a5dd397..7e0210e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -98,6 +98,7 @@ public enum UserActionContextEnum { GET_APPLICATION_EVALUATION("GET_APPLICATION_EVALUATION"), DELETE_APPLICATION_EVALUATION("DELETE_APPLICATION_EVALUATION"), CREATE_UPDATE_APPLICATION_EVALUATION_FORM("CREATE_UPDATE_APPLICATION_EVALUATION_FORM"), + GET_APPLICATION_EVALUATION_FORM("GET_APPLICATION_EVALUATION_FORM"), /** Beneficiary Preferred Call action context **/ CREATE_BENEFICIARY_PREFERRED_CALL("CREATE_BENEFICIARY_PREFERRED_CALL"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java new file mode 100644 index 00000000..7c806d39 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class ApplicationEvaluationFormResponse { + + private Long evaluationFormId; + private Long applicationId; + private Long assignedApplicationId; + private String note; + private String status; + private ApplicationEvaluationFormResponseBean applicationEvaluationFormResponse; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponseBean.java new file mode 100644 index 00000000..804d5845 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponseBean.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; + +@Data +public class ApplicationEvaluationFormResponseBean { + + private Long id; + + private String label; + + private Long callId; + + private List content; + + private List formFields; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java index 4514205b..8e2fba81 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormRepository.java @@ -16,4 +16,6 @@ public interface ApplicationEvaluationFormRepository extends JpaRepository { +public interface EvaluationFormRepository extends JpaRepository { EvaluationFormEntity findByCallIdAndIsDeletedFalse(Long callId); EvaluationFormEntity findByIdAndIsDeletedFalse(Long formId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 682e2999..51f0b52c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -2,12 +2,11 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.*; import java.util.List; @@ -26,4 +25,6 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId); + ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 604d5fd5..cfe4c9df 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -3,17 +3,20 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationEvaluationDao; +import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationFormResponse; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; +import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; @@ -36,6 +39,9 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Autowired private ApplicationEvaluationService applicationEvaluationService; + @Autowired + private ApplicationService applicationService; + @Override @Transactional(rollbackFor = Exception.class) public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( @@ -87,4 +93,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe return applicationEvaluationDao.createApplicationEvaluation(request,applicationRequestBean,evaluationFormId,evaluationId); } + @Override + @Transactional(readOnly = true) + public ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId) { + validator.validateUser(request); + return applicationEvaluationDao.getApplicationEvaluationForm(request,applicationId,assignedApplicationId); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 8fe0c4ac..ff6bfc15 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -7,12 +7,11 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -48,6 +47,7 @@ public interface ApplicationEvaluationApi { HttpServletRequest request, @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); + @Operation(summary = "API to delete ApplicationEvaluation", responses = { @ApiResponse(responseCode = "200", description = "OK"), @@ -75,4 +75,19 @@ public interface ApplicationEvaluationApi { @Parameter(description = "The evaluation id", required = true) @PathVariable(value = "id", required = true) Long id, @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); + @Operation(summary = "Api to get an application evaluation form", + 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 = "", produces = "application/json") + ResponseEntity> getApplicationEvaluationForm(HttpServletRequest request, + @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, + @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index cffaa7f7..de92247c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -3,16 +3,14 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.EvaluationDocumentResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -99,4 +97,16 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation .body(new Response<>(applicationEvaluationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); } + @Override + public ResponseEntity> getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId) { + + /** This code is responsible for creating user action logs for the "get application evaluation form" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION_EVALUATION_FORM).build()); + + ApplicationEvaluationFormResponse applicationEvaluationFormResponse = applicationEvaluationService.getApplicationEvaluationForm(request,applicationId,assignedApplicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationEvaluationFormResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_EVALUATION_FORM_SUCCESS_MSG))); + + } + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6c824cbc..4f4891da 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -267,6 +267,7 @@ evaluationCriteria.invalid=This evaluation criterion does not belong to the curr assigned.application.not.found.with.id=Assigned application with this application ID not found either.application.or.assigned.application.id.required=Either applicationId or assignedApplicationId is required. evaluation.already.exists=An application evaluation already exists for this application ID. +application.evaluation.form.get.success = Application Evaluation Form Fetched Successfully. # Hub Messages hub_create_success=Hub created successfully @@ -362,3 +363,5 @@ evaluation.form.deleted.successfully=Evaluation form deleted successfully. evaluation.form.fetched.successfully=Evaluation form fetched successfully. evaluation.form.not.found=Evaluation form not found. +either.applicationId.or.assignedApplicationId.must.be.provided=Either applicationId or assignedApplicationId must be provided. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index cca4b808..03359586 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -260,6 +260,7 @@ application.evaluation.status.updated.successfully=Stato della valutazione dell' assigned.application.not.found.with.id=Applicazione assegnata con questo ID dell'applicazione non trovata either.application.or.assigned.application.id.required=? richiesto almeno uno tra applicationId o assignedApplicationId. evaluation.already.exists=Una valutazione dell'applicazione esiste gi? per questo ID applicazione. +application.evaluation.form.get.success =Modulo di valutazione della domanda recuperato correttamente.code application.assigned.success.msg =Domanda assegnata con successo application.already.assigned.msg =La domanda ? gi? assegnata @@ -352,3 +353,5 @@ evaluation.form.deleted.successfully=Modulo di valutazione eliminato con success evaluation.form.fetched.successfully=Modulo di valutazione recuperato con successo. evaluation.form.not.found=Modulo di valutazione non trovato. +either.applicationId.or.assignedApplicationId.must.be.provided = "Č necessario fornire applicationId o assegnatoApplicationId." + From fbe126878700d6eb76127da08b27d99609783d18 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 30 Jan 2025 11:44:13 +0530 Subject: [PATCH 46/81] updated code --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index f357b08b..e9cc9cb3 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2359,6 +2359,11 @@ - + + + From 4ae96705fa3d704b0de284e2a2059ec802944da3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 30 Jan 2025 14:20:25 +0530 Subject: [PATCH 47/81] Added evaluation version in the evaluation API's response. --- .../dao/ApplicationEvaluationDao.java | 18 ++++++++++++++++-- .../entities/ApplicationEvaluationEntity.java | 3 +++ .../ApplicationEvaluationFormResponse.java | 2 ++ .../ApplicationEvaluationResponse.java | 3 +++ .../ApplicationEvaluationResponseBean.java | 2 ++ .../db/changelog/db.changelog-1.0.0.xml | 9 +++++++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index edb69587..70ac9a4a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -165,6 +165,7 @@ public class ApplicationEvaluationDao { entity.setSuspendedDays(0L); entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); entity.setEndDate(DateTimeUtil.DateServerToUTC(application.getSubmissionDate().plusDays(30))); + entity.setEvaluationVersion(application.getEvaluationVersion()); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); return entity; } @@ -286,6 +287,7 @@ public class ApplicationEvaluationDao { response.setNote(entity.getNote()); response.setMotivation(entity.getMotivation()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); + response.setEvaluationVersion(EvaluationVersionEnum.valueOf(entity.getEvaluationVersion())); response.setEvaluationEndDate(entity.getEndDate()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); @@ -635,6 +637,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationEntity oldApplicationEvaluation = null; ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId()); VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; + validateApplicationEvaluationRequest(req, application); if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); oldApplicationEvaluation = Utils.getClonedEntityForData(entity); @@ -706,7 +709,14 @@ public class ApplicationEvaluationDao { } } - private void updateAmendmentDocumentsAndFormFields(List applicationAmendmentRequestEntities, List amendmentFormFields) { + private void validateApplicationEvaluationRequest(ApplicationEvaluationRequest req, ApplicationEntity application) { + if(EvaluationVersionEnum.V2.getValue().equals(application.getEvaluationVersion())) { + req.setChecklist(null); + req.setCriteria(null); + } + } + + private void updateAmendmentDocumentsAndFormFields(List applicationAmendmentRequestEntities, List amendmentFormFields) { // Iterate through amendment request entities // @@ -1130,6 +1140,7 @@ public class ApplicationEvaluationDao { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); response.setApplicationId(application.getId()); response.setAssignedApplicationId(assignedApplications.getId()); + response.setEvaluationVersion(EvaluationVersionEnum.valueOf(application.getEvaluationVersion())); response.setNote(null); response.setMotivation(null); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); @@ -2001,7 +2012,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationFormEntity applicationEvaluationFormEntity, List applicationEvaluationFormFieldEntities, EvaluationFormEntity evaluationFormEntity){ - ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = null; + ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = new ApplicationEvaluationFormFieldEntity(); validateFileUploadDocuments(applicationFormFieldRequestBean, evaluationFormEntity); VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; ApplicationEvaluationFormFieldEntity oldApplicationEvaluationFormFieldData = null; @@ -2018,6 +2029,7 @@ public class ApplicationEvaluationDao { break; } else { applicationEvaluationFormFieldEntity.setApplicationEvaluationForm(applicationEvaluationFormEntity); + applicationEvaluationFormFieldEntity.setIsDeleted(Boolean.FALSE); } } } @@ -2131,6 +2143,7 @@ public class ApplicationEvaluationDao { response.setApplicationId(entity.getApplicationId()); response.setEvaluationId(entity.getId()); response.setNote(entity.getNote()); + response.setEvaluationVersion(EvaluationVersionEnum.valueOf(entity.getEvaluationVersion())); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); return response; @@ -2152,6 +2165,7 @@ public class ApplicationEvaluationDao { response.setApplicationId(evaluationEntity.getApplicationId()); response.setNote(evaluationEntity.getNote()); response.setStatus(evaluationEntity.getStatus()); + response.setEvaluationVersion(EvaluationVersionEnum.valueOf(evaluationEntity.getEvaluationVersion())); response.setAssignedApplicationId(evaluationEntity.getAssignedApplicationsEntity().getId()); EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByCallIdAndIsDeletedFalse(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index 6ab7b72c..045a1bdb 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -67,5 +67,8 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "ACTIVE_DAYS") private Long activeDays; + + @Column(name = "evaluationVersion") + private String evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index 7c806d39..d58219dd 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; @Data public class ApplicationEvaluationFormResponse { @@ -10,6 +11,7 @@ public class ApplicationEvaluationFormResponse { private Long assignedApplicationId; private String note; private String status; + private EvaluationVersionEnum evaluationVersion; private ApplicationEvaluationFormResponseBean applicationEvaluationFormResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index c2fcd6cb..4afd57eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -43,4 +44,6 @@ public class ApplicationEvaluationResponse { private BigDecimal amountAccepted; private LocalDateTime dateAccepted; private LocalDateTime dateRejected; + private EvaluationVersionEnum evaluationVersion; + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java index cf4b5865..b8adf7a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.BaseBean; import java.util.List; @@ -11,5 +12,6 @@ public class ApplicationEvaluationResponseBean extends BaseBean { private Long applicationId; private Long evaluationId; private String note; + private EvaluationVersionEnum evaluationVersion; private List formFields; } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index e9cc9cb3..cdc7e6f1 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2366,4 +2366,13 @@ columnName="field_value" newDataType="TEXT"/> + + + + + + + + + From 0f31b61fb94201f0c77ffe1398b6f6eed515e854 Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 30 Jan 2025 14:31:54 +0530 Subject: [PATCH 48/81] Updated code --- .../tendermanagement/dao/DashboardDao.java | 15 ++++-------- .../model/response/ApplicationToConsider.java | 2 +- .../repositories/ApplicationRepository.java | 2 -- .../AssignedApplicationsRepository.java | 23 ++++++++++--------- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 273e60b4..f2ddb971 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CompanyEntity; -import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.entities.*; @@ -12,19 +11,13 @@ import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.math.RoundingMode; -import java.time.temporal.ChronoUnit; import java.util.*; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.List; import java.util.List; import java.util.stream.Collectors; @@ -361,7 +354,7 @@ public class DashboardDao { return PreInstructorWidgetResponseBean.builder() .assignedApplication(ApplicationToConsider.builder() .totalAssignedApplication(0L) - .additionalApplication(BigDecimal.ZERO) + .additionalApplicationPercentage(BigDecimal.ZERO) .build()) .evaluatedApplication(EvaluatedApplication.builder() .evaluatedApplication(0L) @@ -394,12 +387,12 @@ public class DashboardDao { } LocalDateTime yesterday = LocalDateTime.now().minusDays(1); - Long newApplicationsAddedYesterday = assignedApplicationsRepository.countApplicationsAddedYesterdayForHub(hubId, yesterday); + Long newApplicationsAddedYesterday = assignedApplicationsRepository.countApplicationsAddedYesterdayForHub(applicationIds, hubId, yesterday); if (newApplicationsAddedYesterday != null && totalAssignedApplications != null && totalAssignedApplications > 0) { BigDecimal percentageAdded = BigDecimal.valueOf(newApplicationsAddedYesterday) .divide(BigDecimal.valueOf(totalAssignedApplications), 4, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)); - responseBean.getAssignedApplication().setAdditionalApplication(percentageAdded.setScale(2, RoundingMode.HALF_UP)); + responseBean.getAssignedApplication().setAdditionalApplicationPercentage(percentageAdded.setScale(2, RoundingMode.HALF_UP)); } List statuses = Arrays.asList(ApplicationStatusTypeEnum.APPROVED.getValue(), ApplicationStatusTypeEnum.REJECTED.getValue()); @@ -414,7 +407,7 @@ public class DashboardDao { } } - Long rescueInstructorsInProgress = applicationRepository.countApplicationsByIdsAndStatus(applicationIds, ApplicationStatusTypeEnum.SOCCORSO.getValue()); + Long rescueInstructorsInProgress = assignedApplicationsRepository.countApplicationsByIdsAndStatus(applicationIds, AssignedApplicationEnum.SOCCORSO.getValue()); if (rescueInstructorsInProgress != null) { responseBean.getAmendmentInProgress().setTotalAmendmentInProgress(rescueInstructorsInProgress); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java index c417403c..b7f9715b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationToConsider.java @@ -11,5 +11,5 @@ public class ApplicationToConsider { public Long totalAssignedApplication; - private BigDecimal additionalApplication; + private BigDecimal additionalApplicationPercentage; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 0a5fa214..0f8bbf89 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -93,8 +93,6 @@ public interface ApplicationRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); - @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status = :status AND a.isDeleted = false") - Long countApplicationsByIdsAndStatus(@Param("applicationIds") List applicationIds, @Param("status") String status); @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false AND a.updatedDate >= :sevenDaysAgo") Long countEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 6476f4b1..2a9e2da5 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -31,16 +31,17 @@ public interface AssignedApplicationsRepository extends JpaRepository applicationIds); @Query(""" - SELECT COUNT(aa) - FROM AssignedApplicationsEntity aa - JOIN ApplicationEntity a ON aa.application.id = a.id - WHERE a.hubId = :hubId - AND a.isDeleted = false - AND aa.createdDate >= :yesterday -""") - Long countApplicationsAddedYesterdayForHub( - @Param("hubId") Long hubId, - @Param("yesterday") LocalDateTime yesterday - ); + SELECT COUNT(aa) + FROM AssignedApplicationsEntity aa + JOIN aa.application a + WHERE a.hubId = :hubId + AND a.isDeleted = false + AND aa.createdDate >= :yesterday + AND (:applicationIds IS NULL OR aa.application.id IN :applicationIds) + """) + Long countApplicationsAddedYesterdayForHub(@Param("applicationIds") List applicationIds, @Param("hubId") Long hubId, @Param("yesterday") LocalDateTime yesterday); + + @Query("SELECT COUNT(a) FROM AssignedApplicationsEntity a WHERE a.application.id IN :applicationIds AND a.status = :status AND a.isDeleted = false") + Long countApplicationsByIdsAndStatus(@Param("applicationIds") List applicationIds, @Param("status") String status); } From 3507d863390a22c0adc7fd7bdb221cb82f5b6e99 Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 30 Jan 2025 15:10:01 +0530 Subject: [PATCH 49/81] Updated code --- .../tendermanagement/service/impl/DashboardServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index 0a149ab0..963294f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -49,9 +49,9 @@ public class DashboardServiceImpl implements DashboardService { } @Override public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request) { - UserEntity userEntity=validator.validateUser(request); - return dashboardDao.getDashboardWidgetForPreInstructor(userEntity); - + UserEntity userEntity = validator.validateUser(request); + return dashboardDao.getDashboardWidgetForPreInstructor(userEntity); + } @Override public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request) { UserEntity userEntity = validator.validateUser(request); From a9061b1a666c0607557fc3b81cacdbbe127b9fed Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 30 Jan 2025 15:11:49 +0530 Subject: [PATCH 50/81] updated code --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 6 +++--- .../repositories/ApplicationEvaluationRepository.java | 3 +++ .../service/impl/ApplicationEvaluationServiceImpl.java | 8 ++++---- .../web/rest/api/ApplicationEvaluationApi.java | 4 ++-- .../rest/api/impl/ApplicationEvaluationApiController.java | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index edb69587..1a1a1598 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1931,10 +1931,10 @@ public class ApplicationEvaluationDao { return convertToResponse(savedEntity); } - public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationFormId, Long evaluationId){ + public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationFormId, Long assignedApplicationId){ EvaluationFormEntity evaluationFormEntity = evaluationFormService.validateEvaluationForm(evaluationFormId); validateFormFields(applicationRequestBean,evaluationFormEntity); - ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(evaluationId); + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByAssignedApplicationsId(assignedApplicationId); ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,applicationEvaluationEntity); createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); return getEvaluationById(applicationEvaluationEntity.getId(),evaluationFormEntity.getId()); @@ -2001,7 +2001,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationFormEntity applicationEvaluationFormEntity, List applicationEvaluationFormFieldEntities, EvaluationFormEntity evaluationFormEntity){ - ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = null; + ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = new ApplicationEvaluationFormFieldEntity(); validateFileUploadDocuments(applicationFormFieldRequestBean, evaluationFormEntity); VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; ApplicationEvaluationFormFieldEntity oldApplicationEvaluationFormFieldData = null; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 539e55f9..9019aad4 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -21,6 +21,9 @@ public interface ApplicationEvaluationRepository extends JpaRepository findByIdAndIsDeletedFalse(Long id); Optional findByAssignedApplicationsEntity_IdAndIsDeletedFalse(Long assignedApplicationId); + @Query("SELECT ae FROM ApplicationEvaluationEntity ae WHERE ae.assignedApplicationsEntity.id = :assignedApplicationId AND ae.isDeleted = false") + ApplicationEvaluationEntity findByAssignedApplicationsId(Long assignedApplicationId); + Optional findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(Long applicationId, Long assignedApplicationId); Optional findFirstByIsDeletedFalseOrderByCreatedDateDesc(); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index cfe4c9df..55da1766 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -87,10 +87,10 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe } @Override - public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId) { - ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(evaluationId); - validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); - return applicationEvaluationDao.createApplicationEvaluation(request,applicationRequestBean,evaluationFormId,evaluationId); + public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long assignedApplicationId, Long evaluationFormId) { + AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); + validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); + return applicationEvaluationDao.createApplicationEvaluation(request,applicationRequestBean,evaluationFormId,assignedApplicationId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 1bbc6dac..0e59e6ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -68,11 +68,11 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/{id}/form", + @PutMapping(value = "/assignedApplication/{id}", produces = { "application/json" }) ResponseEntity> createApplicationEvaluation(HttpServletRequest request, @Valid @RequestBody ApplicationRequestBean applicationRequestBean, - @Parameter(description = "The evaluation id", required = true) @PathVariable(value = "id", required = true) Long id, + @Parameter(description = "Assigned Application ID", required = true) @PathVariable(value = "id", required = true) Long assignedApplicationId, @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); @Operation(summary = "Api to get an application evaluation form (Evaluation V2)", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index de92247c..3a5df202 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -85,13 +85,13 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId) { + public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long assignedApplicationId, Long evaluationFormId) { /** This code is responsible for creating user action logs for the "Create or update application evaluation form" operation. **/ loggingUtil.logUserAction( UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_EVALUATION_FORM).build()); - ApplicationEvaluationResponseBean applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationRequestBean, evaluationId, evaluationFormId); + ApplicationEvaluationResponseBean applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationRequestBean, assignedApplicationId, evaluationFormId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationEvaluationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); From 4a534aa98e7938af9cd0d75fa794d7c7d3237c1a Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 31 Jan 2025 11:12:59 +0530 Subject: [PATCH 51/81] Done ticket GEPAFINBE-154 --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/PdfDao.java | 104 ++++++++++++------ .../tendermanagement/util/PdfUtils.java | 20 ++++ .../gepafin/tendermanagement/util/Utils.java | 6 + 4 files changed, 98 insertions(+), 33 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9010e157..85bceee3 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -407,5 +407,6 @@ public class GepafinConstant { public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; + public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 8be69097..8247c321 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -152,6 +152,31 @@ public class PdfDao { // Create value cell with rounded corners PdfPTable valueTable = new PdfPTable(1); valueTable.setWidthPercentage(100); + + + Object finalValue = value; + List criteriaObject = (List) contentResponseBean.getSettings().stream() + .filter(setting -> GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(setting.getName())) + .findFirst() + .map(setting -> { + try { + // Assuming setting.getValue() contains the JSON string or object + return PdfUtils.extractRows(finalValue); + } catch (Exception e) { + throw new RuntimeException("Error extracting rows from setting value", e); + } + }) + .orElse(null); + + +// Update value if criteriaObject is not null + if (criteriaObject != null) { + value = criteriaObject; + } + + +// Update value if criteriaObject is not null + if (value instanceof List) { // Further check if the list contains Strings List list = (List) value; @@ -181,11 +206,10 @@ public class PdfDao { document.add(valueTable); } else if (!list.isEmpty() && list.get(0) instanceof Map) { - Object object = value; - String stringvalue = Utils.convertToString(object); - List> fieldValueList = Utils.convertJsonStringIntoJsonList(stringvalue); - - document = createPdfTable(fieldValueList, document, contentResponseBean); + Object object = value; + String stringvalue = Utils.convertToString(object); + List> fieldValueList = Utils.convertJsonStringIntoJsonList(stringvalue); + document = createPdfTable(fieldValueList, document, contentResponseBean); } } else { @@ -231,27 +255,29 @@ public class PdfDao { document.add(valueTable); } else { - String fieldValue1= (String) value; - if(Utils.isValidDateString(fieldValue1)){ - fieldValue1=Utils.formatDateString(String.valueOf(value)); - } - if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); - } + if (value instanceof String) { + String fieldValue1 = (String) value; + if (Utils.isValidDateString(fieldValue1)) { + fieldValue1 = Utils.formatDateString(String.valueOf(value)); + } + if(contentResponseBean.getName().equals("numberinput") && Boolean.TRUE.equals(Utils.isNumeric(fieldValue))){ + fieldValue1=Utils.convertToItalianFormat(fieldValue); + } // PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); - PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); - valueCell.setMinimumHeight(30f); // Set a fixed height for the cell - valueCell.setPaddingLeft(10f); // Adjust left padding as needed - valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering - valueCell.setPaddingBottom(6f); - valueCell.setPaddingLeft(leftMargin); // Increase left margin for value - valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); - valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners - valueTable.addCell(valueCell); - document.add(valueTable); - } + PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); + valueCell.setMinimumHeight(30f); // Set a fixed height for the cell + valueCell.setPaddingLeft(10f); // Adjust left padding as needed + valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering + valueCell.setPaddingBottom(6f); + valueCell.setPaddingLeft(leftMargin); // Increase left margin for value + valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell + valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); + valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners + valueTable.addCell(valueCell); + document.add(valueTable); + } + } } document.add(new Paragraph("\n")); // Add line break after each value @@ -264,11 +290,12 @@ public class PdfDao { Map formulaEnabledMap = new HashMap<>(); Map formulaTypeMap = new HashMap<>(); Map fieldTypeMap = new HashMap<>(); + Map totalMap = new HashMap<>(); Font lightGrayFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(110, 110, 110)); // Light gray contentResponseBean.getSettings().stream() - .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .filter(setting -> "table_columns".equals(setting.getName()) || "criteria_table_columns".equals(setting.getName())) // Check for "table_columns" .map(SettingResponseBean::getValue) .filter(Objects::nonNull) // Ensure value is not null .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map @@ -283,7 +310,7 @@ public class PdfDao { Boolean isFormulaEnabled = (Boolean) fieldData.get("enableFormula"); String formulaType = (String) fieldData.get("lastRowFormula"); String fieldType = (String) fieldData.get("fieldtype"); // Get the field type (e.g., numeric) - + String total= (String) fieldData.get("lastRowText"); if (fieldName != null && fieldDataValue != null) { stateFieldMap.put(fieldName, fieldDataValue); } @@ -297,6 +324,9 @@ public class PdfDao { if (fieldType != null) { fieldTypeMap.put(fieldName, fieldType); // Store the fieldType in the map } + if(total!=null){ + totalMap.put(fieldName,total); + } }); PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries @@ -342,12 +372,15 @@ public class PdfDao { Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present // String fieldValue= (String) value; String fieldValue = value != null ? value.toString() : ""; - if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); - } +// if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ +//// fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); +// } if (Boolean.TRUE.equals(formulaEnabledMap.get(key)) && Boolean.TRUE.equals(GepafinConstant.NUMERIC.equalsIgnoreCase(fieldTypeMap.get(key)))) { calculateValue(key, fieldValue, formulaTypeMap, columnSums); } + if(Boolean.TRUE.equals(Utils.isNumeric(fieldValue))){ + fieldValue=Utils.convertToItalianFormat(fieldValue); + } PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell @@ -397,14 +430,19 @@ public class PdfDao { table.addCell(emptyCell); } } else { - PdfPCell emptyCell = new PdfPCell(new Phrase("")); + String total=null; + if (totalMap.containsKey(key)) { + total=totalMap.getOrDefault(key, ""); + } + PdfPCell emptyCell = new PdfPCell(new Phrase(total,lightGrayFont)); + emptyCell.setPaddingTop(8f); + emptyCell.setPaddingLeft(8f); emptyCell.setBackgroundColor(new BaseColor(239, 243, 248)); table.addCell(emptyCell); } } - // Add the last table to the document document.add(table); @@ -415,7 +453,7 @@ public class PdfDao { try { if (Boolean.FALSE.equals(StringUtils.isEmpty(fieldValue))) { // Use Locale.ITALY to parse the number with the Italian format (comma as decimal separator) - NumberFormat format = NumberFormat.getInstance(Locale.ITALY); + NumberFormat format = NumberFormat.getInstance(Locale.ENGLISH); Number number = format.parse(fieldValue); // Parse the fieldValue as a number double numericValue = number.doubleValue(); // Convert the parsed number to double diff --git a/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java index cfa32b03..1878f5ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java @@ -1,4 +1,6 @@ package net.gepafin.tendermanagement.util; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; @@ -60,6 +62,24 @@ public class PdfUtils { return cell; } + public static Object extractRows(Object content) throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode; + + // Check if input is already a JSON tree (Object) or a String + if (content instanceof String) { + rootNode = objectMapper.readTree((String) content); + } else { + rootNode = objectMapper.valueToTree(content); + } + + // Extract "rows" dynamically + JsonNode rowsArray = rootNode.get("rows"); + + // Convert to a generic List + return objectMapper.convertValue(rowsArray, List.class); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 2f063173..0be87340 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -753,6 +753,12 @@ public class Utils { private static Map defaultErrorResponse() { return Collections.singletonMap("message", Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); } + public static boolean isNumeric(String input) { + if (input == null || input.trim().isEmpty()) { + return false; + } + return input.matches("-?\\d+(\\.\\d+)?"); + } } \ No newline at end of file From ac79924f21cf1d0db8aa12496d0dd817e1620863 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 31 Jan 2025 17:23:22 +0530 Subject: [PATCH 52/81] Removed table validation from draft application --- .../java/net/gepafin/tendermanagement/util/FieldValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 9fb108ae..a9b5ad9a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -135,7 +135,7 @@ public class FieldValidator { break; case GepafinConstant.NON_EMPTY_TABLES: - checkTableValidation(value, fieldId, contentResponseBean, errors); +// checkTableValidation(value, fieldId, contentResponseBean, errors); break; default: From 527f45d2a0e0466050aa680fc544c602950f8c56 Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 31 Jan 2025 19:04:58 +0530 Subject: [PATCH 53/81] Done ticket GEPAFINBE-155 --- .../constants/GepafinConstant.java | 23 +++++++++++++++++++ .../dao/EmailNotificationDao.java | 10 +++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 85bceee3..f2a5cb61 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -408,5 +408,28 @@ public class GepafinConstant { public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; + + public static final String DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA= "\n" + + " \n" + + "
\n" + + "

RICHIESTA INTEGRAZIONE DOCUMENTALE

\n" + + "

Buongiorno,

\n" + + "

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Bando \n" + + " {{call_name}} di cui al Protocollo n. {{protocol_number}} del\n" + + " {{protocol_date}} e {{protocol_time}}, alla luce dell'attivitĂ  istruttoria svolta,\n" + + " segnaliamo quanto segue:\n" + + "

\n" + + " {{note}}\n" + + "

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione caricandola all'interno dello sportello\n" + + " online {{platform_link}} entro e non oltre {{response_days}} giorni dal ricevimento della presente comunicazione,\n" + + " precisando che, in caso di mancata ricezione nei termini indicati, saremo costretti a non prendere in considerazione la Vostra richiesta di finanziamento.\n" + + "

\n" + + "

La documentazione trasmessa e le informazioni fornite saranno processate dall'istruttore assegnatario della pratica.\n" + + "

\n" + + "

Distinti Saluti,

\n" + + "

{{email_signature}}

\n" + + "
\n" + + " \n" + + ""; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 3988b35a..7bc8010d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -94,7 +94,15 @@ public class EmailNotificationDao { subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); // bodyPlaceholders.put("{{legal_mail}}", legalMail); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + String body; + if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST)) { + bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); + bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); + body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); + } + else { + body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + } return new EmailContentResponse(subject, body, systemEmailTemplateResponse); } From 7fc53897e23026a030e59a8a226d8b5566113860 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 31 Jan 2025 20:02:42 +0530 Subject: [PATCH 54/81] Added validation in form creation --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 5 +++++ .../tendermanagement/service/impl/FormServiceImpl.java | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 1c7ed019..5e5cfdef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; @@ -118,6 +119,10 @@ public class FormDao { //cloned entity for old call data. CallEntity oldCallData = Utils.getClonedEntityForData(callEntity); + if(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.PUBLISHED_CALL_NOT_UPDATE)); + } List flowDataEntities = flowDataRepository.findByCallId(callEntity.getId()); List flowEdgesEntities = flowEdgesRepository.findByCallId(callEntity.getId()); if (Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities == null) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities == null)) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java index 51199767..fe62af2f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -27,6 +28,7 @@ public class FormServiceImpl implements FormService { private Validator validator; @Override + @Transactional(rollbackFor = Exception.class) public FormResponseBean createForm(HttpServletRequest request,Long callId, FormRequest formRequest) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); @@ -34,18 +36,21 @@ public class FormServiceImpl implements FormService { } @Override + @Transactional(rollbackFor = Exception.class) public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest,Boolean forceDeleteFlow) { UserEntity user = validator.validateUser(request); return formDao.updateForm(user, formId,formRequest,forceDeleteFlow); } @Override + @Transactional(readOnly = true) public FormResponseBean getFormById(HttpServletRequest request, Long formId) { UserEntity user = validator.validateUser(request); return formDao.getFormEntityById(user, formId); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteForm(HttpServletRequest request, Long formId) { UserEntity user = validator.validateUser(request); formDao.deleteFormById(user, formId); @@ -57,6 +62,7 @@ public class FormServiceImpl implements FormService { } @Override + @Transactional(readOnly = true) public List getFormsByCallId(HttpServletRequest request, Long callId) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); From bb6187a908839c378dbc331d5dc0ca9f05c135cb Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 3 Feb 2025 12:28:12 +0530 Subject: [PATCH 55/81] Fixed table validation issue --- .../gepafin/tendermanagement/dao/FormDao.java | 4 +- .../tendermanagement/util/FieldValidator.java | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 5e5cfdef..3f558574 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -471,7 +471,9 @@ public class FormDao { FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); String fieldValue = getFieldValue(contentResponseBean); - validator.isRequired(value, fieldValidatorBean.getIsRequired(), fieldValue); + + validator.isRequired(value, fieldValidatorBean.getIsRequired(), fieldValue) + .validateCustomTableValidation(value,fieldValidatorBean.getCustom(),fieldValue,contentResponseBean); }); if (Boolean.TRUE.equals(isSendValidationError)) { validator.validate(); diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index a9b5ad9a..ffcdfcac 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -147,11 +147,51 @@ public class FieldValidator { return this; } - private static void checkTableValidation(String value, String fieldId, ContentResponseBean contentResponseBean, List errors) { + + + public FieldValidator validateCustomTableValidation(String value, String customRule, String fieldId, ContentResponseBean contentResponseBean) { + if (customRule == null || value == null) { + return this; // No custom rule to validate + } + + switch (customRule) { + + case GepafinConstant.NON_EMPTY_TABLES: + try { + checkTableValidation(value, fieldId, contentResponseBean, errors); + } catch (Exception e) { + throw new RuntimeException(e); + } + break; + + default: + // If the custom rule is unknown, just log or add an error (optional) + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_CUSTOM), fieldId, customRule)); + break; + } + + return this; + } + + private static void checkTableValidation(String value, String fieldId, ContentResponseBean contentResponseBean, List errors) throws Exception { Map stateFieldMap= new HashMap<>(); + String tableType = contentResponseBean.getSettings().stream() + .filter(setting ->GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(setting.getName())) // Check for "table_columns" + .map(SettingResponseBean::getName) // Extract the name + .findFirst() // Get the first matching result + .orElse(null); // Default to null if no match + + if (tableType!=null){ + try { + Object object = PdfUtils.extractRows(value);; + value= Utils.convertToString(object); + } catch (Exception e) { + throw new RuntimeException(e); + } + } contentResponseBean.getSettings().stream() - .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .filter(setting -> "table_columns".equals(setting.getName()) || GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(setting.getName())) // Check for "table_columns" .map(SettingResponseBean::getValue) .filter(Objects::nonNull) // Ensure value is not null .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map From e6a700fc47bc5b3092d6a46bddb67b94fca8e536 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Feb 2025 13:04:27 +0530 Subject: [PATCH 56/81] Fixed criteria issue --- .../java/net/gepafin/tendermanagement/dao/FormDao.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 5e5cfdef..415753b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -36,6 +36,8 @@ import java.util.stream.Collectors; @Component public class FormDao { + private final Logger log = LoggerFactory.getLogger(FormDao.class); + @Autowired private FormRepository formRepository; @@ -203,8 +205,9 @@ public class FormDao { String formFieldId,Long evaluationCriteriaId) { EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); if (Boolean.FALSE.equals(evaluationCriteria.getCall().getId().equals(callEntity.getId()))) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.EVALUATIONCRITERIA_INVALID)); + log.info("This evaluation criterion does not belong to the current call. Expected Call ID = {}, Found Call ID = {}", + callEntity.getId(), evaluationCriteria.getCall().getId()); + return; } CriteriaFormFieldEntity criteriaFormField = new CriteriaFormFieldEntity(); criteriaFormField.setCallId(callEntity.getId()); From 03fbae86d63af99329bf68642c0696a881bf7024 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Feb 2025 16:36:11 +0530 Subject: [PATCH 57/81] Create an endpoint to get application evaluation version --- .../constants/GepafinConstant.java | 1 + .../dao/ApplicationEvaluationDao.java | 18 ++++++++++++++++++ .../enums/UserActionContextEnum.java | 1 + .../ApplicationEvaluationVersionResponse.java | 13 +++++++++++++ .../service/ApplicationEvaluationService.java | 2 ++ .../impl/ApplicationEvaluationServiceImpl.java | 9 +++++++++ .../web/rest/api/ApplicationEvaluationApi.java | 14 ++++++++++++++ .../ApplicationEvaluationApiController.java | 12 ++++++++++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 10 files changed, 72 insertions(+) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationVersionResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 85bceee3..3c2a0942 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -112,6 +112,7 @@ public class GepafinConstant { public static final String APPLICATION_UPDATED_SUCCESS_MSG = "application.updated.success"; public static final String DELETE_APPLICATION_SUCCESS_MSG = "application.deleted.success"; public static final String GET_APPLICATION_SUCCESS_MSG = "application.get.success"; + public static final String GET_APPLICATION_EVALUATION_VERSION_SUCCESS_MSG = "application.evaluation.version.get.success"; public static final String APPLICATION_NOT_FOUND_MSG = "application.not.found"; public static final String APPLICATION_FORM_FIELD_NOT_FOUND = "application.form.field.not.found"; public static final String FORM_ID_DOES_NOT_MACTHES = "Form.not.matches.to.call.initial.form"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 3579b90c..f84e7b3f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -2201,5 +2201,23 @@ public class ApplicationEvaluationDao { return evaluationFormResponseBean; } + public ApplicationEvaluationVersionResponse getApplicationEvaluationVersion(HttpServletRequest request, Long applicationId){ + + log.info("Fetching application evaluation version with ID: {}", applicationId); + + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); + return buildApplicationEvaluationVersionResponse(applicationEntity); + + } + private ApplicationEvaluationVersionResponse buildApplicationEvaluationVersionResponse(ApplicationEntity applicationEntity) { + ApplicationEvaluationVersionResponse response = new ApplicationEvaluationVersionResponse(); + response.setApplicationId(applicationEntity.getId()); + response.setCallId(applicationEntity.getCall().getId()); + response.setCompanyId(applicationEntity.getCompanyId()); + response.setEvaluationVersion(EvaluationVersionEnum.valueOf(applicationEntity.getEvaluationVersion())); + response.setEvaluationId(applicationEntity.getApplicationEvaluationId()); + return response; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index d0839370..847ee9b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -35,6 +35,7 @@ public enum UserActionContextEnum { /** application action context **/ GET_APPLICATION("GET_APPLICATION"), CREATE_UPDATE_APPLICATION_FORM("CREATE_UPDATE_APPLICATION_FORM"), + GET_APPLICATION_EVALUATION_VERSION("GET_APPLICATION_EVALUATION_VERSION"), CREATE_APPLICATION("CREATE_APPLICATION"), DELETE_APPLICATION("DELETE_APPLICATION"), GET_ALL_APPLICATION("GET_ALL_APPLICATION"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationVersionResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationVersionResponse.java new file mode 100644 index 00000000..99f1ae75 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationVersionResponse.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; + +@Data +public class ApplicationEvaluationVersionResponse { + private Long callId; + private Long companyId; + private Long applicationId; + private Long evaluationId; + private EvaluationVersionEnum evaluationVersion; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 51f0b52c..50b4f299 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -27,4 +27,6 @@ public interface ApplicationEvaluationService { ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId); + ApplicationEvaluationVersionResponse getApplicationEvaluationVersion(HttpServletRequest request, Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 55da1766..c1f5d0f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationEvaluationFormResp import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationVersionResponse; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.ApplicationService; @@ -100,4 +101,12 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe return applicationEvaluationDao.getApplicationEvaluationForm(request,applicationId,assignedApplicationId); } + @Override + public ApplicationEvaluationVersionResponse getApplicationEvaluationVersion(HttpServletRequest request, Long applicationId) { + validator.validateUser(request); + return applicationEvaluationDao.getApplicationEvaluationVersion(request,applicationId); + } + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 0e59e6ac..f1769b92 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -89,5 +89,19 @@ public interface ApplicationEvaluationApi { @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); + @Operation(summary = "Api to get application evaluation version", + 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 = "/application/{id}/version", produces = { "application/json" }) + ResponseEntity> getApplicationEvaluationVersion(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("id") Long id); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index 3a5df202..f7b9b8c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -109,4 +109,16 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } + @Override + public ResponseEntity> getApplicationEvaluationVersion(HttpServletRequest request, Long applicationId) { + + /** This code is responsible for creating user action logs for the "get application evaluation version" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION_EVALUATION_VERSION).build()); + + ApplicationEvaluationVersionResponse applicationEvaluationVersionResponse = applicationEvaluationService.getApplicationEvaluationVersion(request,applicationId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationEvaluationVersionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_EVALUATION_VERSION_SUCCESS_MSG))); + } + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6e058a9f..ef54674d 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -152,6 +152,7 @@ application.created.success=Application successfully created. application.updated.success=Application successfully updated. application.deleted.success=Application successfully deleted. application.get.success=Application details fetched successfully. +application.evaluation.version.get.success = Application evaluation version fetched successfully. application.not.found=Application not found with the given ID. application.form.field.not.found=Application form field not found. Form.not.matches.to.call.initial.form=Form id does not matches to initial form id of call. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 624c7dfe..e14120cd 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -146,6 +146,7 @@ application.created.success=Applicazione creata con successo. application.updated.success=Applicazione aggiornata con successo. application.deleted.success=Applicazione eliminata con successo. application.get.success=Dettagli dell'applicazione recuperati con successo. +application.evaluation.version.get.success = Versione di valutazione dell'applicazione recuperata correttamente. application.not.found=Applicazione non trovata con l'ID fornito. application.form.field.not.found=Campo del modulo di domanda non trovato. Form.not.matches.to.call.initial.form=L'ID del modulo non corrisponde all'ID del modulo iniziale della chiamata. From ecee3159c8b669f031f610607bd023339c08e2e6 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 3 Feb 2025 18:06:55 +0530 Subject: [PATCH 58/81] Updated get endpoint for application evaluation(v2) --- .../dao/ApplicationEvaluationDao.java | 14 +++---- .../ApplicationEvaluationFormResponse.java | 38 +++++++++++++++++-- .../rest/api/ApplicationEvaluationApi.java | 2 +- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 3579b90c..3f3259c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -139,6 +139,10 @@ public class ApplicationEvaluationDao { @Autowired private EvaluationFormRepository evaluationFormRepository; + @Autowired + private ObjectMapper objectMapper; + + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -2161,17 +2165,13 @@ public class ApplicationEvaluationDao { } private ApplicationEvaluationFormResponse processEvaluationForm(ApplicationEvaluationEntity evaluationEntity){ - ApplicationEvaluationFormResponse response = new ApplicationEvaluationFormResponse(); - response.setApplicationId(evaluationEntity.getApplicationId()); - response.setNote(evaluationEntity.getNote()); - response.setStatus(evaluationEntity.getStatus()); - response.setEvaluationVersion(EvaluationVersionEnum.valueOf(evaluationEntity.getEvaluationVersion())); - response.setAssignedApplicationId(evaluationEntity.getAssignedApplicationsEntity().getId()); + Object convertedResponse = convertToResponse(evaluationEntity); + + ApplicationEvaluationFormResponse response = objectMapper.convertValue(convertedResponse, ApplicationEvaluationFormResponse.class); EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByCallIdAndIsDeletedFalse(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId()); if (evaluationFormEntity != null) { - response.setEvaluationFormId(evaluationFormEntity.getId()); response.setApplicationEvaluationFormResponse(convertEvaluationFormToResponse(evaluationFormEntity, evaluationEntity)); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index d58219dd..f51378e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -1,18 +1,48 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + @Data public class ApplicationEvaluationFormResponse { - private Long evaluationFormId; + + private Long id; private Long applicationId; + private ApplicationStatusTypeEnum applicationStatus; private Long assignedApplicationId; private String note; - private String status; - private EvaluationVersionEnum evaluationVersion; + private ApplicationEvaluationStatusTypeEnum status; + private Long minScore; private ApplicationEvaluationFormResponseBean applicationEvaluationFormResponse; - + private List files; + private List evaluationDocument; + private List amendmentDetails; + private LocalDateTime createdDate; + private LocalDateTime updatedDate; + private String beneficiary; + private Long assignedUserId; + private String assignedUserName; + private Long protocolNumber; + private String callName; + private String motivation; + private LocalDateTime submissionDate; + private LocalDateTime evaluationEndDate; + private LocalDateTime callEndDate; + private String companyName; + private LocalDateTime assignedAt; + private String ndg; + private String appointmentId; + private BigDecimal amountRequested; + private BigDecimal amountAccepted; + private LocalDateTime dateAccepted; + private LocalDateTime dateRejected; + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 0e59e6ac..d955ecaf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -84,7 +84,7 @@ public interface ApplicationEvaluationApi { @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 = "", produces = "application/json") + @GetMapping(value = "/v2", produces = "application/json") ResponseEntity> getApplicationEvaluationForm(HttpServletRequest request, @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); From 88f68432eb175435982b9297b89f8b4a0fb3d849 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 3 Feb 2025 19:07:07 +0530 Subject: [PATCH 59/81] Fixed FormDao issue --- src/main/java/net/gepafin/tendermanagement/dao/FormDao.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index e4be1b0d..4311076f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; From 5438bc8d670bfaea1ac67627118ad72b13915b1b Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 3 Feb 2025 20:34:10 +0530 Subject: [PATCH 60/81] Done ticket GEPAFINBE-158 --- .../tendermanagement/dao/DashboardDao.java | 14 ++++----- ...ApplicationAmendmentRequestRepository.java | 2 ++ .../repositories/ApplicationRepository.java | 11 ------- .../AssignedApplicationsRepository.java | 31 +++++++++++++++++-- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 5b705fd9..ac6b6fd7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -432,14 +432,14 @@ public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation( return preInstructorWidgetResponseBean; } private void setPreInstructorWidgets(List applicationIds, PreInstructorWidgetResponseBean responseBean,Long hubId) { - - Long totalAssignedApplications = assignedApplicationsRepository.countAssignedApplicationsByApplicationIds(applicationIds); + List assignedApplicationStatus = Arrays.asList(AssignedApplicationEnum.AWAITING.getValue(), AssignedApplicationEnum.OPEN.getValue()); + Long totalAssignedApplications = assignedApplicationsRepository.countAssignedApplicationsByApplicationIds(applicationIds,assignedApplicationStatus); if (totalAssignedApplications != null) { responseBean.getAssignedApplication().setTotalAssignedApplication(totalAssignedApplications); } LocalDateTime yesterday = LocalDateTime.now().minusDays(1); - Long newApplicationsAddedYesterday = assignedApplicationsRepository.countApplicationsAddedYesterdayForHub(applicationIds, hubId, yesterday); + Long newApplicationsAddedYesterday = assignedApplicationsRepository.countApplicationsAddedYesterdayForHub(applicationIds, hubId, yesterday,assignedApplicationStatus); if (newApplicationsAddedYesterday != null && totalAssignedApplications != null && totalAssignedApplications > 0) { BigDecimal percentageAdded = BigDecimal.valueOf(newApplicationsAddedYesterday) .divide(BigDecimal.valueOf(totalAssignedApplications), 4, RoundingMode.HALF_UP) @@ -449,17 +449,17 @@ public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation( List statuses = Arrays.asList(ApplicationStatusTypeEnum.APPROVED.getValue(), ApplicationStatusTypeEnum.REJECTED.getValue()); LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7); - Long evaluatedApplication = applicationRepository.countEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); + Long evaluatedApplication = assignedApplicationsRepository.countEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); if (evaluatedApplication != null) { responseBean.getEvaluatedApplication().setEvaluatedApplication(evaluatedApplication); - BigDecimal dailyAverage = applicationRepository.countDailyAverageEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); + BigDecimal dailyAverage = assignedApplicationsRepository.countDailyAverageEvaluatedApplicationsInLast7Days(applicationIds, statuses, sevenDaysAgo); if (dailyAverage != null) { responseBean.getEvaluatedApplication().setDailyAverage(dailyAverage.setScale(2, RoundingMode.HALF_UP)); // Rounded to 2 decimal places } } - - Long rescueInstructorsInProgress = assignedApplicationsRepository.countApplicationsByIdsAndStatus(applicationIds, AssignedApplicationEnum.SOCCORSO.getValue()); + List amendmentStatus =Arrays.asList( ApplicationAmendmentRequestEnum.AWAITING.getValue(), ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + Long rescueInstructorsInProgress = applicationAmendmentRequestRepository.countAmendmentsByApplicationIds(applicationIds,amendmentStatus); if (rescueInstructorsInProgress != null) { responseBean.getAmendmentInProgress().setTotalAmendmentInProgress(rescueInstructorsInProgress); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 7037ba7e..fc492019 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -148,4 +148,6 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository applicationIds, @Param("statuses") List statuses); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 0f8bbf89..a536baaf 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -94,16 +94,5 @@ public interface ApplicationRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); - @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false AND a.updatedDate >= :sevenDaysAgo") - Long countEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, - @Param("statuses") List statuses, - @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); - - @Query("SELECT (COUNT(a) / 7.0) FROM ApplicationEntity a WHERE a.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false AND a.updatedDate >= :sevenDaysAgo") - BigDecimal countDailyAverageEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, - @Param("statuses") List statuses, - @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); - - } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 90791462..43a40f04 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -27,8 +28,8 @@ public interface AssignedApplicationsRepository extends JpaRepository findApplicationIdsByUserIdAndIsDeletedFalse(@Param("userId") Long userId); - @Query("SELECT COUNT(a) FROM AssignedApplicationsEntity a WHERE a.application.id IN :applicationIds AND a.isDeleted = false") - Long countAssignedApplicationsByApplicationIds(@Param("applicationIds") List applicationIds); + @Query("SELECT COUNT(a) FROM AssignedApplicationsEntity a WHERE a.application.id IN :applicationIds AND a.status IN :statuses AND a.isDeleted = false") + Long countAssignedApplicationsByApplicationIds(@Param("applicationIds") List applicationIds, @Param("statuses") List statuses); @Query(""" SELECT COUNT(aa) @@ -36,10 +37,12 @@ public interface AssignedApplicationsRepository extends JpaRepository= :yesterday + AND aa.isDeleted = false AND (:applicationIds IS NULL OR aa.application.id IN :applicationIds) """) - Long countApplicationsAddedYesterdayForHub(@Param("applicationIds") List applicationIds, @Param("hubId") Long hubId, @Param("yesterday") LocalDateTime yesterday); + Long countApplicationsAddedYesterdayForHub(@Param("applicationIds") List applicationIds, @Param("hubId") Long hubId, @Param("yesterday") LocalDateTime yesterday, @Param("statuses") List statuses); @Query("SELECT COUNT(a) FROM AssignedApplicationsEntity a WHERE a.application.id IN :applicationIds AND a.status = :status AND a.isDeleted = false") Long countApplicationsByIdsAndStatus(@Param("applicationIds") List applicationIds, @Param("status") String status); @@ -83,6 +86,28 @@ public interface AssignedApplicationsRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); + @Query(" SELECT COUNT(aa) FROM AssignedApplicationsEntity aa " + + "JOIN aa.application a " + + "WHERE a.status IN :statuses " + + "AND a.isDeleted = false " + + "AND a.updatedDate >= :sevenDaysAgo " + + "AND aa.status = 'CLOSE'" + + "AND aa.isDeleted = false " + + " AND (:applicationIds IS NULL OR aa.application.id IN :applicationIds) ") + Long countEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); + @Query("SELECT (COUNT(a) / 7.0) FROM AssignedApplicationsEntity aa " + + "JOIN aa.application a " + + "WHERE a.status IN :statuses " + + "AND a.isDeleted = false " + + "AND a.updatedDate >= :sevenDaysAgo " + + "AND aa.status = 'CLOSE'" + + "AND aa.isDeleted = false " + + "AND (:applicationIds IS NULL OR aa.application.id IN :applicationIds)") + BigDecimal countDailyAverageEvaluatedApplicationsInLast7Days(@Param("applicationIds") List applicationIds, + @Param("statuses") List statuses, + @Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); } From 3803a6ff98f76994b767ba528241664f5c7d4080 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Feb 2025 15:52:36 +0530 Subject: [PATCH 61/81] Updated code for Application Evaluation form --- .../dao/ApplicationEvaluationDao.java | 96 +++++++++++++------ .../ApplicationEvaluationFormRequestBean.java | 19 ++++ .../ApplicationEvaluationResponseBean.java | 17 ---- .../service/ApplicationEvaluationService.java | 3 +- .../ApplicationEvaluationServiceImpl.java | 10 +- .../rest/api/ApplicationEvaluationApi.java | 7 +- .../ApplicationEvaluationApiController.java | 9 +- 7 files changed, 101 insertions(+), 60 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7ecadfcb..75ce444c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1946,13 +1946,27 @@ public class ApplicationEvaluationDao { return convertToResponse(savedEntity); } - public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationFormId, Long assignedApplicationId){ + public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationFormId, Long assignedApplicationId){ + + UserEntity user = validator.validateUser(request); + AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); + ApplicationEntity application = applicationService.validateApplication(assignedApplicationsEntity.getApplication().getId()); + + // Convert FormRequestBean to ApplicationEvaluationRequest + ApplicationEvaluationRequest req = convertToApplicationEvaluationRequest(applicationEvaluationFormRequestBean); + + // Call the existing method to create or update evaluation + ApplicationEvaluationResponse evaluationResponse = createOrUpdateApplicationEvaluation(user, req, assignedApplicationId); + + ApplicationEvaluationEntity entity = applicationEvaluationService.validateApplicationEvaluation(evaluationResponse.getId()); + + //Handling Application Evaluation form EvaluationFormEntity evaluationFormEntity = evaluationFormService.validateEvaluationForm(evaluationFormId); - validateFormFields(applicationRequestBean,evaluationFormEntity); - ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByAssignedApplicationsId(assignedApplicationId); - ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,applicationEvaluationEntity); - createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); - return getEvaluationById(applicationEvaluationEntity.getId(),evaluationFormEntity.getId()); + validateFormFields(applicationEvaluationFormRequestBean,evaluationFormEntity); +// ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByAssignedApplicationsId(assignedApplicationId); + ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,entity); + createOrUpdateMultipleFormFields(applicationEvaluationFormRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); + return processEvaluationForm(entity); } private ApplicationEvaluationFormEntity getApplicationEvaluationFormOrCreate(EvaluationFormEntity evaluationFormEntity, ApplicationEvaluationEntity applicationEvaluationEntity) { @@ -1979,7 +1993,7 @@ public class ApplicationEvaluationDao { return saveApplicationEvaluationFormEntity(applicationEvaluationFormEntity); } - public void validateFormFields(ApplicationRequestBean request, EvaluationFormEntity evaluationFormEntity) { + public void validateFormFields(ApplicationEvaluationFormRequestBean request, EvaluationFormEntity evaluationFormEntity) { List contentResponseBeans=evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity).getContent(); @@ -2074,17 +2088,6 @@ public class ApplicationEvaluationDao { return documentIds; } - public ApplicationEvaluationResponseBean getEvaluationById(Long evaluationId, Long evaluationFormId){ - ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(evaluationId); - - ApplicationEvaluationFormEntity applicationEvaluationFormEntity = applicationEvaluationFormRepository.findByEvaluationIdAndEvaluationFormId(applicationEvaluationEntity.getId(),evaluationFormId); - List applicationEvaluationFormFieldEntities = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormId(applicationEvaluationFormEntity.getId()); - List evaluationFormFieldResponseBeans = createEvaluationFormFieldResponse(applicationEvaluationFormFieldEntities, applicationEvaluationFormEntity); - ApplicationEvaluationResponseBean applicationEvaluationResponseBean = convertApplicationEvaluationEntityToApplicationEvaluationResponseBean(applicationEvaluationEntity); - applicationEvaluationResponseBean.setFormFields(evaluationFormFieldResponseBeans); - - return applicationEvaluationResponseBean; - } private List createEvaluationFormFieldResponse( List evaluationFormFieldEntities, @@ -2141,15 +2144,39 @@ public class ApplicationEvaluationDao { return applicationEvaluationFormFieldReponseBean; } - private ApplicationEvaluationResponseBean convertApplicationEvaluationEntityToApplicationEvaluationResponseBean(ApplicationEvaluationEntity entity){ - ApplicationEvaluationResponseBean response = new ApplicationEvaluationResponseBean(); - response.setId(entity.getId()); - response.setApplicationId(entity.getApplicationId()); - response.setEvaluationId(entity.getId()); - response.setNote(entity.getNote()); - response.setEvaluationVersion(EvaluationVersionEnum.valueOf(entity.getEvaluationVersion())); - response.setCreatedDate(entity.getCreatedDate()); - response.setUpdatedDate(entity.getUpdatedDate()); + private ApplicationEvaluationFormResponse convertToApplicationEvaluationResponseBean(ApplicationEvaluationResponse applicationEvaluationResponse){ + ApplicationEvaluationFormResponse response = new ApplicationEvaluationFormResponse(); + response.setId(applicationEvaluationResponse.getId()); + response.setApplicationId(applicationEvaluationResponse.getApplicationId()); + response.setNote(applicationEvaluationResponse.getNote()); + response.setEvaluationVersion(applicationEvaluationResponse.getEvaluationVersion()); + response.setCreatedDate(applicationEvaluationResponse.getCreatedDate()); + response.setUpdatedDate(applicationEvaluationResponse.getUpdatedDate()); + response.setApplicationStatus(applicationEvaluationResponse.getApplicationStatus()); + response.setAssignedApplicationId(applicationEvaluationResponse.getAssignedApplicationId()); + response.setMinScore(applicationEvaluationResponse.getMinScore()); + response.setStatus(applicationEvaluationResponse.getStatus()); + response.setFiles(applicationEvaluationResponse.getFiles()); + response.setEvaluationDocument(applicationEvaluationResponse.getEvaluationDocument()); + response.setAmendmentDetails(applicationEvaluationResponse.getAmendmentDetails()); + response.setBeneficiary(applicationEvaluationResponse.getBeneficiary()); + response.setAssignedUserId(applicationEvaluationResponse.getAssignedUserId()); + response.setAssignedUserName(applicationEvaluationResponse.getAssignedUserName()); + response.setProtocolNumber(applicationEvaluationResponse.getProtocolNumber()); + response.setCallName(applicationEvaluationResponse.getCallName()); + response.setMotivation(applicationEvaluationResponse.getMotivation()); + response.setSubmissionDate(applicationEvaluationResponse.getSubmissionDate()); + response.setEvaluationEndDate(applicationEvaluationResponse.getEvaluationEndDate()); + response.setCallEndDate(applicationEvaluationResponse.getCallEndDate()); + response.setCompanyName(applicationEvaluationResponse.getCompanyName()); + response.setAssignedAt(applicationEvaluationResponse.getAssignedAt()); + response.setNdg(applicationEvaluationResponse.getNdg()); + response.setAppointmentId(applicationEvaluationResponse.getAppointmentId()); + response.setAmountRequested(applicationEvaluationResponse.getAmountRequested()); + response.setAmountAccepted(applicationEvaluationResponse.getAmountAccepted()); + response.setDateAccepted(applicationEvaluationResponse.getDateAccepted()); + response.setDateRejected(applicationEvaluationResponse.getDateRejected()); + return response; } @@ -2219,5 +2246,20 @@ public class ApplicationEvaluationDao { return response; } + public static ApplicationEvaluationRequest convertToApplicationEvaluationRequest(ApplicationEvaluationFormRequestBean formRequestBean) { + ApplicationEvaluationRequest request = new ApplicationEvaluationRequest(); + request.setFiles(formRequestBean.getFiles()); + request.setEvaluationDocument(formRequestBean.getEvaluationDocument()); + request.setAmendmentDetails(formRequestBean.getAmendmentDetails()); + request.setNote(formRequestBean.getNote()); + request.setApplicationStatus(formRequestBean.getApplicationStatus()); + request.setMotivation(formRequestBean.getMotivation()); + request.setAmountAccepted(formRequestBean.getAmountAccepted()); + + request.setCriteria(null); + request.setChecklist(null); + + return request; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java new file mode 100644 index 00000000..d2c0e2dc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ApplicationEvaluationFormRequestBean { + private List files; + private List evaluationDocument; + private List amendmentDetails; + private String note; + private ApplicationStatusForEvaluation applicationStatus; + private List formFields; + private String motivation; + private BigDecimal amountAccepted; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java deleted file mode 100644 index b8adf7a6..00000000 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponseBean.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.gepafin.tendermanagement.model.response; - -import lombok.Data; -import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; -import net.gepafin.tendermanagement.model.BaseBean; - -import java.util.List; - -@Data -public class ApplicationEvaluationResponseBean extends BaseBean { - private Long applicationId; - private Long evaluationId; - private String note; - private EvaluationVersionEnum evaluationVersion; - private List formFields; -} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 50b4f299..86140ac6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.enums.FormActionEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationFormRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; @@ -23,7 +24,7 @@ public interface ApplicationEvaluationService { ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId); - ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long evaluationId, Long evaluationFormId); + ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationId, Long evaluationFormId); ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index c1f5d0f2..044c0902 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -7,13 +7,10 @@ import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationFormRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationFormResponse; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; - -import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationVersionResponse; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; @@ -88,10 +85,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe } @Override - public ApplicationEvaluationResponseBean createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long assignedApplicationId, Long evaluationFormId) { + @Transactional(rollbackFor = Exception.class) + public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); - return applicationEvaluationDao.createApplicationEvaluation(request,applicationRequestBean,evaluationFormId,assignedApplicationId); + return applicationEvaluationDao.createApplicationEvaluation(request,applicationEvaluationFormRequestBean,evaluationFormId,assignedApplicationId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 891b86c8..18576c61 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.enums.FormActionEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationFormRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; @@ -68,10 +69,10 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/assignedApplication/{id}", + @PutMapping(value = "/assignedApplication/{id}/v2", produces = { "application/json" }) - ResponseEntity> createApplicationEvaluation(HttpServletRequest request, - @Valid @RequestBody ApplicationRequestBean applicationRequestBean, + ResponseEntity> createApplicationEvaluation(HttpServletRequest request, + @Valid @RequestBody ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, @Parameter(description = "Assigned Application ID", required = true) @PathVariable(value = "id", required = true) Long assignedApplicationId, @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index f7b9b8c1..50eadb36 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -6,10 +6,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; -import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; -import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; @@ -85,13 +82,13 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long assignedApplicationId, Long evaluationFormId) { + public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { /** This code is responsible for creating user action logs for the "Create or update application evaluation form" operation. **/ loggingUtil.logUserAction( UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_EVALUATION_FORM).build()); - ApplicationEvaluationResponseBean applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationRequestBean, assignedApplicationId, evaluationFormId); + ApplicationEvaluationFormResponse applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationEvaluationFormRequestBean, assignedApplicationId, evaluationFormId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationEvaluationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); From 9771e69e3e5f0928a20ab29772ff5ff95880c7fe Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Feb 2025 16:27:47 +0530 Subject: [PATCH 62/81] updated url for application evaluation PUT Api --- .../tendermanagement/web/rest/api/ApplicationEvaluationApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 18576c61..4798e078 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -69,7 +69,7 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/assignedApplication/{id}/v2", + @PutMapping(value = "/v2/assignedApplication/{id}", produces = { "application/json" }) ResponseEntity> createApplicationEvaluation(HttpServletRequest request, @Valid @RequestBody ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, From 2e49ac5807848585d5edbf74d2df5f8b7715979c Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 4 Feb 2025 17:43:10 +0530 Subject: [PATCH 63/81] Done ticket GEPAFINBE-160 --- .../constants/GepafinConstant.java | 16 ++++++++++++++++ .../dao/EmailNotificationDao.java | 4 ++++ .../db/changelog/db.changelog-1.0.0.xml | 6 +++++- ...template_application_rejected_04_02_2025.sql | 17 +++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index c85dacd7..20657e87 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -432,5 +432,21 @@ public class GepafinConstant { " \n" + " \n" + ""; + + + public static final String APPLICATION_REJECTED_SVILUPPUMBRIA = "\n" + + " \n" + + "
\n" + + "

Buongiorno,

\n" + + "

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al\n" + + " Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}},\n" + + " la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

\n" + + "

Le motivazioni sono le seguenti: {{form_text}}

\n" + + "

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno finoltrare richiesta di chiarimenti e/o osservazioni alla scrivente Società ai sensi e per gli effetti dell’art.10 bis della L.241/1990 e s.m.i.

\n" + + "

Distinti Saluti,

\n" + + "

{{email_signature}}

\n" + + "
\n" + + " \n" + + ""; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 7bc8010d..bcdf4069 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -100,6 +100,10 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); } + if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { + bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); + body = Utils.replacePlaceholders(GepafinConstant.APPLICATION_REJECTED_SVILUPPUMBRIA, bodyPlaceholders); + } else { body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index cdc7e6f1..ff297cba 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2374,5 +2374,9 @@ - + + + + diff --git a/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql b/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql new file mode 100644 index 00000000..67815ab0 --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql @@ -0,0 +1,17 @@ +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

Buongiorno,

+

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, + la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

+

Le motivazioni sono le seguenti: {{form_text}}

+

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno formulare ricorso al Gestore tramite modello disponibile nello sportello online + {{platform_link}}.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION'; \ No newline at end of file From c80e97cfd8ac489be9c6a8653e94cfe3bb118902 Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 5 Feb 2025 12:14:10 +0530 Subject: [PATCH 64/81] Updated email content for DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA --- .../net/gepafin/tendermanagement/constants/GepafinConstant.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 20657e87..d04a6abf 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -416,7 +416,7 @@ public class GepafinConstant { "

RICHIESTA INTEGRAZIONE DOCUMENTALE

\n" + "

Buongiorno,

\n" + "

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Bando \n" + - " {{call_name}} di cui al Protocollo n. {{protocol_number}} del\n" + + " “{{call_name}}“ di cui al Protocollo n. {{protocol_number}} del\n" + " {{protocol_date}} e {{protocol_time}}, alla luce dell'attività istruttoria svolta,\n" + " segnaliamo quanto segue:\n" + "

\n" + From a3ac053594f2bdecc6e89ee1cf8269b66da4681f Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Feb 2025 12:39:03 +0530 Subject: [PATCH 65/81] Fixed issue for email updation in company --- .../java/net/gepafin/tendermanagement/dao/CompanyDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index b014b779..3a527d9f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -230,8 +230,8 @@ public class CompanyDao { String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; setIfUpdated(userWithCompanyEntity::getJson, userWithCompanyEntity::setJson, responseJson); } - setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, userWithCompanyEntity.getPec()); - setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, userWithCompanyEntity.getEmail()); + setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, companyRequest.getPec()); + setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, companyRequest.getEmail()); setIfUpdated(userWithCompanyEntity::getContactName, userWithCompanyEntity::setContactName, companyRequest.getContactName()); setIfUpdated(userWithCompanyEntity::getContactEmail, userWithCompanyEntity::setContactEmail, companyRequest.getContactEmail()); setIfUpdated(userWithCompanyEntity::getIsLegalRepresentant, userWithCompanyEntity::setIsLegalRepresentant, companyRequest.getIsLegalRepresentant()); From a20d2908e1ad9d6e175ca39ef28b1fb685faec55 Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 5 Feb 2025 15:33:27 +0530 Subject: [PATCH 66/81] Done changes related to instructor dashboard API --- .../tendermanagement/dao/DashboardDao.java | 28 +++++++++++++++---- .../service/DashboardService.java | 2 +- .../service/impl/DashboardServiceImpl.java | 6 ++-- .../web/rest/api/DashboardApi.java | 3 +- .../rest/api/impl/DashboardApiController.java | 4 +-- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index ac6b6fd7..3da577dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.dao; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -10,6 +12,9 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -278,14 +283,16 @@ public class DashboardDao { AmendmentWidgetResponseBean amendmentWidgetResponseBean = initializeAmendmentResponseBean(); Long hubId = userEntity.getHub().getId(); - List applicationIds = getApplicationIdsForUserOrHub(userEntity,hubId); + List applicationIds = getApplicationIdsForUserOrHub(userEntity,hubId,null); setAmendmentCounts(applicationIds,amendmentWidgetResponseBean, hubId); calculateExpiringRequestsIn48Hours(applicationIds,amendmentWidgetResponseBean, hubId); calculateAverageResponseDays(applicationIds,amendmentWidgetResponseBean,hubId); return amendmentWidgetResponseBean; } - public List getApplicationIdsForUserOrHub(UserEntity userEntity, Long hubId) { - if (validator.checkIsPreInstructor()) { + public List getApplicationIdsForUserOrHub(UserEntity userEntity, Long hubId , Long userId) { + if (userId != null) { + return assignedApplicationsRepository.findApplicationIdsByUserIdAndIsDeletedFalse(userId); + } else if (validator.checkIsPreInstructor()) { return assignedApplicationsRepository.findApplicationIdsByUserIdAndIsDeletedFalse(userEntity.getId()); } else { return applicationRepository.findApplicationIdsByHubId(hubId); @@ -423,10 +430,21 @@ public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation( .build()) .build(); } - public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(UserEntity userEntity) { + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request, Long userId) { + UserEntity userEntity = validator.validateUser(request); + if (validator.checkIsPreInstructor() && userId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); + } + if (userId != null) { + validator.validatePreInstructor(request, userId); + if (validator.checkIsInstructorManager() && !userEntity.getId().equals(userId)) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + } PreInstructorWidgetResponseBean preInstructorWidgetResponseBean = initializeDashboardPreInstructorResponseBean(); Long hubId = userEntity.getHub().getId(); - List applicationIds = getApplicationIdsForUserOrHub(userEntity, hubId); + List applicationIds = getApplicationIdsForUserOrHub(userEntity, hubId,userId); setPreInstructorWidgets(applicationIds, preInstructorWidgetResponseBean,hubId); calculateAverageEvaluationTime(applicationIds, preInstructorWidgetResponseBean, hubId); return preInstructorWidgetResponseBean; diff --git a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java index a1782f6e..6950eaae 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java @@ -15,7 +15,7 @@ public interface DashboardService { public BeneficiaryWidgetResponseBean getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId); public ApplicationWidgetResponseBean getApplicationDetails(HttpServletRequest request); public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request); - public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request); + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request,Long userId); public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index 963294f4..1b44c350 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -48,9 +48,9 @@ public class DashboardServiceImpl implements DashboardService { return dashboardDao.getAmendmentDetails(userEntity); } @Override - public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request) { - UserEntity userEntity = validator.validateUser(request); - return dashboardDao.getDashboardWidgetForPreInstructor(userEntity); + public PreInstructorWidgetResponseBean getDashboardWidgetForPreInstructor(HttpServletRequest request,Long userId) { + validator.validateUser(request); + return dashboardDao.getDashboardWidgetForPreInstructor(request,userId); } @Override public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java index de62d73d..02b2fed7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java @@ -20,6 +20,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; public interface DashboardApi { @@ -107,7 +108,7 @@ public interface DashboardApi { @GetMapping(value = "/instructor/amendment", produces = { "application/json" }) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") - ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request); + ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request, @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java index 0ef56f7b..bb9f6d49 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java @@ -75,12 +75,12 @@ public class DashboardApiController implements DashboardApi { } @Override - public ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request) { + public ResponseEntity> getDashboardWidgetForPreInstructor(HttpServletRequest request,Long userId) { /** This code is responsible for creating user action logs for the "Get dashboard stats widget for amendment page" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_DASHBOARD_WIDGET_FOR_PRE_INSTRUCTOR).build()); - PreInstructorWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForPreInstructor(request); + PreInstructorWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForPreInstructor(request,userId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } From a3d3fec0e1d8bdcd1582546813fc8370e4b36108 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 6 Feb 2025 15:03:49 +0530 Subject: [PATCH 67/81] Updated code --- .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index bcdf4069..8133e5f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -100,7 +100,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); } - if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { + else if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); body = Utils.replacePlaceholders(GepafinConstant.APPLICATION_REJECTED_SVILUPPUMBRIA, bodyPlaceholders); } From 610aece1f6ca5153e54e21bb7ec652331026afaf Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 6 Feb 2025 15:11:42 +0530 Subject: [PATCH 68/81] Done ticket GEPAFINBE-162 --- pom.xml | 6 + .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 202 +++++++++++++++--- .../tendermanagement/util/FieldValidator.java | 24 ++- .../gepafin/tendermanagement/util/Utils.java | 25 ++- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 +- 7 files changed, 227 insertions(+), 35 deletions(-) diff --git a/pom.xml b/pom.xml index c463be91..a42534bf 100644 --- a/pom.xml +++ b/pom.xml @@ -245,6 +245,12 @@ reactor-netty + + net.objecthunter + exp4j + 0.4.8 + + diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9010e157..f6d9ac42 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -407,5 +407,6 @@ public class GepafinConstant { public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; + public static final String FORMULA_AMOUNT_NOT_MATCHED="formula.amount.not.matches.requested.amount"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 794e7796..f43a030f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -31,6 +31,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.h2.util.IOUtils; +import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -49,11 +50,16 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.text.MessageFormat; +import java.text.NumberFormat; +import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -94,29 +100,29 @@ public class ApplicationDao { @Autowired private FlowDataRepository flowDataRepository; - + @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; - + @Autowired private Validator validator; - + @Autowired private CompanyService companyService; @Autowired private S3PathConfig s3PathConfig; - + @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; - + @Value("${default_System_Receiver_Email}") private String defaultSystemReceiverEmail; - + @Value("${rinaldo_email}") private String rinaldoEmail; - + @Value("${carlo_email}") private String carloEmail; @@ -125,37 +131,37 @@ public class ApplicationDao { @Autowired private AmazonS3Service amazonS3Service; - + @Autowired private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; - + // @Value("${aws.s3.url.folder.signed.document}") // private String signedDocumentS3Folder; - + @Value("${default.hub.uuid}") private String defaultHubUuid; - + @Autowired private UserService userService; @Autowired private S3PathConfig s3ConfigBean; - + @Autowired private ProtocolDao protocolDao; - + @Autowired private HubService hubService; @Autowired private EmailNotificationDao emailNotificationDao; - + @Autowired private FormDao formDao; @Autowired private EmailLogDao emailLogDao; - + @Autowired private UserWithCompanyRepository userWithCompanyRepository; @@ -183,6 +189,7 @@ public class ApplicationDao { @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); // callService.validatePublishedCall(formEntity.getCall().getId()); @@ -258,7 +265,7 @@ public class ApplicationDao { // List contentResponseBeans = Utils.convertJsonStringToList( // applicationFormEntity.getForm().getContent(), ContentResponseBean.class); - + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(applicationFormEntity.getForm()).getContent(); for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) { @@ -309,7 +316,7 @@ public class ApplicationDao { ); } ApplicationEntity oldApplicationDataEntity = Utils.getClonedEntityForData(applicationEntity); - + validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); applicationEntity.setIsDeleted(true); applicationEntity = applicationRepository.save(applicationEntity); @@ -356,9 +363,9 @@ public class ApplicationDao { // // return applicationResponses; // } - + public List getAllApplications(UserEntity userEntity, Long callId, Long companyId,List statusList) { - + log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); Specification spec = search(userEntity, callId, companyId,statusList); @@ -482,15 +489,18 @@ public class ApplicationDao { public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity, FormEntity formEntity) { + FieldValidator fieldValidator = FieldValidator.create(); List existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); - return formFieldResponseBeans.stream().map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity, existingFields, formEntity)) + List applicationFormFieldEntities=formFieldResponseBeans.stream().map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity, existingFields, formEntity,fieldValidator)) .collect(Collectors.toList()); + fieldValidator.validate(); + return applicationFormFieldEntities; } public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, - ApplicationFormEntity applicationFormEntity, List applicationFormFieldEntities, FormEntity formEntity) { + ApplicationFormEntity applicationFormEntity, List applicationFormFieldEntities, FormEntity formEntity,FieldValidator fieldValidator) { ApplicationFormFieldEntity applicationFormFieldEntity = new ApplicationFormFieldEntity(); @@ -506,7 +516,7 @@ public class ApplicationDao { .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) .findFirst() .ifPresent(setting -> { - + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); if(fieldValue!=null) { try { @@ -538,6 +548,7 @@ public class ApplicationDao { } } } + calculationProcessForFormula(applicationFormEntity,contentResponseBeans,applicationFormFieldRequestBean,fieldValidator); Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); if (applicationFormFieldRequestBean.getFieldValue() != null) { @@ -560,7 +571,6 @@ public class ApplicationDao { VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationFormFieldData).newData(applicationFormField).build()); log.info("Version history logged for action: {}, Field ID: {}", actionType, applicationFormFieldEntity.getFieldId()); - return applicationFormField; } @@ -818,7 +828,7 @@ public class ApplicationDao { if(formApplicationResponse.getContent() != null && formApplicationResponse.getFormFields() != null) { formApplicationResponses.add(formApplicationResponse); } - + } public FormApplicationResponse processForm(FormEntity formEntity, ApplicationEntity applicationEntity) { @@ -954,7 +964,7 @@ public class ApplicationDao { return (int) Math.round(progress); } public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) { - + // List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); List contentResponseBeans=formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); @@ -1034,7 +1044,7 @@ public class ApplicationDao { SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_USER_AND_COMPANY, hub, null); - + // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); subjectPlaceholders.put("{{call_name}}", call.getName()); @@ -1211,17 +1221,17 @@ public class ApplicationDao { } public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) { - + ApplicationEntity applicationEntity = validateApplication(applicationId); // validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - + if (validator.checkIsPreInstructor()) { ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluationByApplicationId(applicationId); validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); } else { validator.validateUserId(request, applicationEntity.getUserId()); } - + ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); if(applicationSignedDocument == null) { @@ -1230,11 +1240,11 @@ public class ApplicationDao { } return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } - + public void deleteSignedDocument(HttpServletRequest request, Long applicationId) { ApplicationEntity applicationEntity = validateApplication(applicationId); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - + ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); //cloned entity for old data @@ -1539,5 +1549,135 @@ public class ApplicationDao { } } + public void calculationProcessForFormula(ApplicationFormEntity applicationFormEntity, List contentResponseBeans, ApplicationFormFieldRequestBean applicationFormFieldRequestBean,FieldValidator fieldValidator) { + List formulaValue = new ArrayList<>(); + String formulaValueOpt=null; + String label=null; + for (ContentResponseBean contentResponseBean:contentResponseBeans){ + if(contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())){ + for (SettingResponseBean settingResponseBean:contentResponseBean.getSettings()){ + if (settingResponseBean.getName().equals("label")){ + label= String.valueOf(settingResponseBean.getValue()); + } + if(settingResponseBean.getName().equals("formula")){ + String value= (String) settingResponseBean.getValue(); + formulaValueOpt=value; + formulaValue=Utils.extractValues(value); + } + } + } + } + Map mappedFormulaValue = new HashMap<>(); + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); + if (formulaValueOpt != null && fieldValue==null) { + fieldValue=0; + } + + for (ContentResponseBean contentResponseBean : contentResponseBeans) { + String contentId = contentResponseBean.getId(); + + // Extract variable values once per contentResponseBean to avoid repeated stream operations + Set variableValues = contentResponseBean.getSettings().stream() + .filter(setting -> "variable".equals(setting.getName())) + .flatMap(setting -> { + Object value = setting.getValue(); // Get the raw value + if (value instanceof String) { + return Stream.of((String) value); // Handle single String case + } else if (value instanceof List) { + return ((List) value).stream() + .filter(item -> item instanceof String) // Ensure it's a String + .map(item -> (String) item); // Convert to String + } else { + return Stream.empty(); // Ignore unexpected types + } + }) + .collect(Collectors.toSet()); // Collect into a Set for uniqueness + + for (String formula : formulaValue) { + if (variableValues.contains(formula)) { // O(1) lookup instead of O(n) + mappedFormulaValue.put(formula, contentId); + } + } + } + Map updatedMappedFormulaValue = new HashMap<>(); + + for (Map.Entry entry : mappedFormulaValue.entrySet()) { + String variable = entry.getKey(); + String contentId = entry.getValue(); + + // Repository call using contentId + Optional optionalEntity = applicationFormFieldRepository.findByApplicationFormIdAndFieldId(applicationFormEntity.getId(),contentId); + // If entity is found, extract fieldValue and fieldId + optionalEntity.ifPresent(entity -> { + String entityFieldValue = entity.getFieldValue(); // Assuming getter method exists + String fieldId = entity.getFieldId(); // Assuming getter method exists + String tableType = contentResponseBeans.stream() + .filter(content -> content.getId().equals(fieldId)) // Match Content ID with fieldId + .flatMap(content -> content.getSettings().stream()) // Extract settings + .filter(setting -> "criteria_table_columns".equals(setting.getName())) // Match name + .map(setting -> setting.getName()) // Return the name of the setting + .findFirst() // Get the first match + .orElse(null); // Default to null if no match + + if(tableType!=null){ + JSONObject jsonObject = new JSONObject(entityFieldValue); + + // Extract the value of total + entityFieldValue = jsonObject.getString("total"); + + } + + updatedMappedFormulaValue.put(fieldId, entityFieldValue); + }); + } + if(formulaValueOpt==null || formulaValueOpt.isEmpty()){ + return; + } + double finalValue = evaluateFormula(formulaValueOpt, mappedFormulaValue, updatedMappedFormulaValue); + + fieldValidator.formulaValidation(fieldValue, finalValue, label); + } + + + public static double evaluateFormula(String formula, Map mappedFormulaValue, Map updatedMappedFormulaValue) { + // Step 1: Extract all placeholders (variables) like {rest}, {another_var}, etc. + Pattern pattern = Pattern.compile("\\{(.*?)\\}"); + Matcher matcher = pattern.matcher(formula); + List variables = new ArrayList<>(); + + while (matcher.find()) { + variables.add(matcher.group(1)); // Extract variable names inside the curly braces + } + + // Step 2: Replace placeholders with corresponding fieldValue + Map variableValues = new HashMap<>(); + + for (String variable : variables) { + String fieldId = mappedFormulaValue.get(variable); + if (fieldId != null && updatedMappedFormulaValue.containsKey(fieldId)) { + String fieldValueStr = updatedMappedFormulaValue.get(fieldId); + try { + double fieldValue = Double.parseDouble(fieldValueStr); // Assuming fieldValue is numeric + variableValues.put(variable, fieldValue); + } catch (NumberFormatException e) { + // Handle invalid number format gracefully (e.g., log an error or default to 0) + variableValues.put(variable, 0.0); + } + } + } + + // Step 3: Replace variables in the formula with their corresponding values + String expression = formula; + for (String variable : variables) { + Double value = variableValues.get(variable); + if (value != null) { + // Replace {variable} with its corresponding value in the formula + expression = expression.replace("{" + variable + "}", String.valueOf(value)); + } + } + + // Step 4: Evaluate the mathematical expression + return Utils.evaluateExpression(expression); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 9fb108ae..1d335735 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -2,6 +2,10 @@ package net.gepafin.tendermanagement.util; import java.text.MessageFormat; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -9,12 +13,18 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.FormDao; import net.gepafin.tendermanagement.dao.VatCheckDao; +import net.gepafin.tendermanagement.entities.ApplicationFormEntity; +import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ContentRequestBean; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.SettingResponseBean; +import net.gepafin.tendermanagement.repositories.ApplicationFormFieldRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.ValidationException; import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -232,5 +242,17 @@ public class FieldValidator { // Now contentRequestBean is populated with the data from the JSON return contentRequestBean; } - + public FieldValidator formulaValidation(Object fieldValue, double finalValue, String label) { + if (fieldValue != null) { + try { + double fieldValueAsDouble = Double.parseDouble(fieldValue.toString()); // Convert fieldValue to double + if (Double.compare(finalValue, fieldValueAsDouble) != 0) { // Compare doubles safely + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.FORMULA_AMOUNT_NOT_MATCHED), label)); + } + } catch (NumberFormatException e) { + throw new CustomValidationException(Status.BAD_REQUEST, "Invalid field value: " + fieldValue); + } + } + return this; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 2f063173..68e8c8b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -11,6 +11,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -27,6 +28,8 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.model.request.GlobalFilters; +import net.objecthunter.exp4j.Expression; +import net.objecthunter.exp4j.ExpressionBuilder; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,6 +57,9 @@ import javax.crypto.Cipher; import javax.crypto.Mac; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; import static org.apache.commons.lang3.StringUtils.isEmpty; @@ -753,6 +759,23 @@ public class Utils { private static Map defaultErrorResponse() { return Collections.singletonMap("message", Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); } + public static List extractValues(String input) { + List extractedValues = new ArrayList<>(); + Pattern pattern = Pattern.compile("\\{(.*?)\\}"); // Regex to match {value} + Matcher matcher = pattern.matcher(input); - + while (matcher.find()) { + extractedValues.add(matcher.group(1)); // Extract value inside {} + } + return extractedValues; + } + public static double evaluateExpression(String expression) { + try { + Expression exp = new ExpressionBuilder(expression).build(); + return exp.evaluate(); + } catch (Exception e) { + e.printStackTrace(); + return Double.NaN; // Return NaN if the expression is invalid + } + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6e058a9f..ab9b1d8c 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -367,5 +367,6 @@ either.applicationId.or.assignedApplicationId.must.be.provided=Either applicatio assigned.application.status.updated.successfully=Assigned application status updated successfully. validation.required.requested.amount=The Requested Amount configuration should be mandatory. +formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 624c7dfe..c7f83aed 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -358,6 +358,5 @@ either.applicationId.or.assignedApplicationId.must.be.provided = "ďż˝ necessario assigned.application.status.updated.successfully=Stato dell'applicazione assegnata aggiornato con successo. validation.required.requested.amount=La configurazione dell'importo richiesto ďż˝ obbligatoria. - - +formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. From 8d78f32234cf65498269061b274bccb6c26c336f Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 6 Feb 2025 16:58:30 +0530 Subject: [PATCH 69/81] Added new form field data --- .../resources/db/changelog/db.changelog-1.0.0.xml | 8 ++++++++ .../db/dump/update_form_field_data_06-02-2025.sql | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/resources/db/dump/update_form_field_data_06-02-2025.sql diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ff297cba..eab66c3d 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2379,4 +2379,12 @@ + + + + + + + diff --git a/src/main/resources/db/dump/update_form_field_data_06-02-2025.sql b/src/main/resources/db/dump/update_form_field_data_06-02-2025.sql new file mode 100644 index 00000000..970f442b --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_06-02-2025.sql @@ -0,0 +1,14 @@ + +INSERT INTO FORM_FIELD (ID, SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( + 22, + 22, + 'switch', + 'Casella di spunta "Checklist"', + 'Per selezioni binarie, accettazioni, conferme', + '[{"name":"label","value":"Casella di Spunta"},{"name":"isChecklistItem","value":true}]', + '{"isRequired":false}', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +); \ No newline at end of file From 322b49792a79d944f98bbdd8a8b6461215a3dc52 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 6 Feb 2025 20:15:14 +0530 Subject: [PATCH 70/81] Done ticket GEPAFINBE-164 --- .../tendermanagement/dao/AssignedApplicationsDao.java | 2 ++ .../java/net/gepafin/tendermanagement/dao/CallDao.java | 9 ++++++++- .../gepafin/tendermanagement/entities/CallEntity.java | 6 ++++++ .../model/request/CreateCallRequestStep1.java | 4 ++++ .../model/request/UpdateCallRequestStep1.java | 4 ++++ .../model/response/AssignedApplicationsResponse.java | 3 +++ .../model/response/CallDetailsResponseBean.java | 4 ++++ .../tendermanagement/model/response/CallResponse.java | 4 ++++ src/main/resources/db/changelog/db.changelog-1.0.0.xml | 7 +++++++ 9 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 9729fd85..05c65292 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -200,6 +200,8 @@ public class AssignedApplicationsDao { if(applicationEvaluationEntity.isPresent()){ assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate()); } + assignedApplicationsResponse.setNumberOfCheck(application.getCall().getNumberOfCheck()); + assignedApplicationsResponse.setProductId(application.getCall().getProductId()); return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index ce9fefd9..277fb68c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -201,6 +201,8 @@ public class CallDao { callEntity.setStartTime(DateTimeUtil.parseTime(createCallRequest.getStartTime())); callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime())); callEntity.setHub(userEntity.getHub()); + callEntity.setNumberOfCheck(createCallRequest.getNumberOfCheck()); + callEntity.setProductId(createCallRequest.getProductId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "Create Call" operation. **/ @@ -607,6 +609,8 @@ public class CallDao { setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue()); + setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck()); + setIfUpdated(callEntity::getProductId, callEntity::setProductId, updateCallRequest.getProductId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "update call step 1" operation **/ @@ -713,7 +717,8 @@ public class CallDao { callDetailsResponseBean.setPhoneNumber(callEntity.getPhoneNumber()); callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); - + callDetailsResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); + callDetailsResponseBean.setProductId(callEntity.getProductId()); return callDetailsResponseBean; } @@ -737,6 +742,8 @@ public class CallDao { createCallResponseBean.setFaq(faqService.getFaqByCallId(callEntity.getId())); createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); + createCallResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); + createCallResponseBean.setProductId(callEntity.getProductId()); return createCallResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 990d27a1..a9098234 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -91,5 +91,11 @@ public class CallEntity extends BaseEntity { @Column(name = "evaluationVersion") private String evaluationVersion; + + @Column(name = "NUMBER_OF_CHECK") + private BigDecimal numberOfCheck; + + @Column(name = "PRODUCT_ID") + private BigDecimal productId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 75c2a3d0..ca8abd99 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -24,6 +24,10 @@ public class CreateCallRequestStep1 { private BigDecimal amountMax; + private BigDecimal numberOfCheck; + + private BigDecimal productId; + private List aimedTo; private String documentationRequested; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java index d63e5754..2ebda4b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -41,6 +41,10 @@ public class UpdateCallRequestStep1 { private List faq; + private BigDecimal numberOfCheck; + + private BigDecimal productId; + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 83c1ab0a..8597cafa 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.BaseBean; +import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -23,6 +24,8 @@ public class AssignedApplicationsResponse extends BaseBean { private LocalDateTime callEndDate; private String companyName; private LocalDateTime evaluationEndDate; + private BigDecimal numberOfCheck; + private BigDecimal productId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index ebe82d1e..256a564b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -57,5 +57,9 @@ public class CallDetailsResponseBean { private Long preferredCallId; + private BigDecimal numberOfCheck; + + private BigDecimal productId; + private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 01c36068..6390e91c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -50,6 +50,10 @@ public class CallResponse { private String phoneNumber; + private BigDecimal numberOfCheck; + + private BigDecimal productId; + @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime startTime; diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ff297cba..2b7fbb71 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2379,4 +2379,11 @@ + + + + + + + From da677ca039ee67f8fa94556c311073a2826a3ed7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 6 Feb 2025 20:33:40 +0530 Subject: [PATCH 71/81] Created a new endpoint to update user --- .../gepafin/tendermanagement/dao/UserDao.java | 54 +++++++++++++++++++ .../request/UpdateUserReqForBeneficiary.java | 18 +++++++ .../tendermanagement/service/UserService.java | 2 + .../service/impl/UserServiceImpl.java | 6 +++ .../web/rest/api/UserApi.java | 20 ++++++- .../web/rest/api/impl/UserApiController.java | 18 ++++++- 6 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReqForBeneficiary.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 0ffa0b42..acb098ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -597,5 +598,58 @@ public class UserDao { return userResponseBeans; } + public UserResponseBean updateUserDetails(HttpServletRequest request , Long userId, UpdateUserReqForBeneficiary userReq){ + log.info("Updating user by beneficiary with ID: {}", userId); + UserEntity userEntity = validator.validateUserId(request, userId); + + UserEntity oldUserEntity = Utils.getClonedEntityForData(userEntity); + log.info("Current user details: {}", userEntity); + log.info("New user details: {}", userReq); + + HubEntity hubEntity = hubService.valdateHub(userEntity.getHub().getId()); + String beneficiaryRoleType = RoleStatusEnum.ROLE_BENEFICIARY.getValue(); + + if (validator.checkIsBeneficiary()) { + // Validate if the new email already exists for another beneficiary in the same hub + boolean emailExistsForBeneficiary = userRepository.existsByEmailIgnoreCaseForBeneficiaries( + userReq.getEmail(), hubEntity.getUniqueUuid(), beneficiaryRoleType); + + if (emailExistsForBeneficiary) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); + } + + setIfUpdated(userEntity::getEmail,userEntity::setEmail,userReq.getEmail()); // Only update email if role is beneficiary + } + + BeneficiaryEntity oldBeneficiaryEntity = null; + + if(userEntity.getBeneficiary()!=null) { + oldBeneficiaryEntity = Utils.getClonedEntityForData(userEntity.getBeneficiary()); + setIfUpdated(userEntity.getBeneficiary()::getFirstName, userEntity.getBeneficiary()::setFirstName, userReq.getFirstName()); + setIfUpdated(userEntity.getBeneficiary()::getLastName, userEntity.getBeneficiary()::setLastName, userReq.getLastName()); + setIfUpdated(userEntity.getBeneficiary()::getOrganization, userEntity.getBeneficiary()::setOrganization, userReq.getOrganization()); + setIfUpdated(userEntity.getBeneficiary()::getAddress, userEntity.getBeneficiary()::setAddress, userReq.getAddress()); + setIfUpdated(userEntity.getBeneficiary()::getPhoneNumber, userEntity.getBeneficiary()::setPhoneNumber, userReq.getPhoneNumber()); + setIfUpdated(userEntity.getBeneficiary()::getDateOfBirth, userEntity.getBeneficiary()::setDateOfBirth, userReq.getDateOfBirth()); + setIfUpdated(userEntity.getBeneficiary()::getCity, userEntity.getBeneficiary()::setCity, userReq.getCity()); + setIfUpdated(userEntity.getBeneficiary()::getCountry, userEntity.getBeneficiary()::setCountry, userReq.getCountry()); + + /** This code is responsible for adding a version history log for the "Update beneficiary details " operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldBeneficiaryEntity).newData(userEntity.getBeneficiary()).build()); + } + + userEntity = userRepository.save(userEntity); + + /** This code is responsible for adding a version history log for the "Update user details by beneficiary" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldUserEntity).newData(userEntity).build()); + + return convertUserEntityToUserResponse(userEntity); + } + + + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReqForBeneficiary.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReqForBeneficiary.java new file mode 100644 index 00000000..3516db8f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReqForBeneficiary.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class UpdateUserReqForBeneficiary { + private String firstName; + private String lastName; + private String email; + private String phoneNumber; + private String organization; + private String address; + private String city; + private String country; + private LocalDateTime dateOfBirth; +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 6a92a667..d13d8dff 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -47,4 +47,6 @@ public interface UserService { public UserEntity getUserEntityById(Long userId); List getAllUsers(HttpServletRequest request, List roleIds); + UserResponseBean updateUserDetails(HttpServletRequest request, Long userId, UpdateUserReqForBeneficiary userReq); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index b959ba61..320cb616 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -130,4 +130,10 @@ public class UserServiceImpl implements UserService { UserEntity user=validator.validateUser(request); return userDao.getAllUsers(user, roleIds); } + + @Override + @Transactional(rollbackFor = Exception.class) + public UserResponseBean updateUserDetails(HttpServletRequest request, Long userId, UpdateUserReqForBeneficiary userReq) { + return userDao.updateUserDetails(request , userId, userReq); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 6dc45bec..b5517cd6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -47,7 +47,7 @@ public interface UserApi { return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); } - @Operation(summary = "Api to update user", + @Operation(summary = "Api to update user (Only for super admin)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -243,6 +243,24 @@ public interface UserApi { @RequestMapping("favicon.ico") @ResponseBody void returnNoFavicon(); + + @Operation(summary = "Api to update user", + 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)}))}) + @RequestMapping(value = "/{userId}/update-details", + produces = {"application/json"}, + method = RequestMethod.PUT) + default ResponseEntity> updateUserDetails(HttpServletRequest request, + @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @Parameter(description = "User request object", required = true) @Valid @RequestBody UpdateUserReqForBeneficiary userReq) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index 0d649943..35088a3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -247,5 +247,21 @@ public class UserApiController implements UserApi { public void returnNoFavicon() { // Do nothing } - + + @Override + public ResponseEntity> updateUserDetails(HttpServletRequest request, + @PathVariable("userId") Long userId, + @Valid @RequestBody UpdateUserReqForBeneficiary userReq) { + log.info("Update User for Beneficiary- User ID: {}, Request Body: {}", userId, userReq); + + /** This code is responsible for "Updating user details by beneficiary" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_USER_DETAILS).build()); + + UserResponseBean updatedUser = userService.updateUserDetails(request, userId, userReq); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); + } + } \ No newline at end of file From 93f663826caa28810f2a9dfef921d7b562cd776c Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 6 Feb 2025 21:24:33 +0530 Subject: [PATCH 72/81] Added two fields in application evaluation object --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 5 +++++ .../model/response/ApplicationEvaluationFormResponse.java | 2 ++ .../model/response/ApplicationEvaluationResponse.java | 2 ++ 3 files changed, 9 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 75ce444c..2c36b86c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -295,6 +295,9 @@ public class ApplicationEvaluationDao { response.setEvaluationEndDate(entity.getEndDate()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); + response.setNumberOfCheck(entity.getAssignedApplicationsEntity().getApplication().getCall().getNumberOfCheck()); + response.setProductId(entity.getAssignedApplicationsEntity().getApplication().getCall().getProductId()); + } @@ -1153,6 +1156,8 @@ public class ApplicationEvaluationDao { response.setEvaluationEndDate(entity.getEndDate()); LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); + response.setNumberOfCheck(call.getNumberOfCheck()); + response.setProductId(call.getProductId()); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setChecklistResponses(entity, application.getId(), response, checklistEntities); setFileResponses(entity, application.getId(), response, applicationFormEntities); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index f51378e0..f71cf808 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -44,5 +44,7 @@ public class ApplicationEvaluationFormResponse { private LocalDateTime dateAccepted; private LocalDateTime dateRejected; private EvaluationVersionEnum evaluationVersion; + private BigDecimal numberOfCheck; + private BigDecimal productId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 4afd57eb..312e6f35 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -44,6 +44,8 @@ public class ApplicationEvaluationResponse { private BigDecimal amountAccepted; private LocalDateTime dateAccepted; private LocalDateTime dateRejected; + private BigDecimal numberOfCheck; + private BigDecimal productId; private EvaluationVersionEnum evaluationVersion; } From 9be0cf07a5523ce47ba93f7229d216dd777af3b3 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Fri, 7 Feb 2025 15:51:46 +0530 Subject: [PATCH 73/81] Fixed issue in application validation --- .../net/gepafin/tendermanagement/util/FieldValidator.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 951a6b3a..d311547a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -173,11 +173,6 @@ public class FieldValidator { throw new RuntimeException(e); } break; - - default: - // If the custom rule is unknown, just log or add an error (optional) - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_CUSTOM), fieldId, customRule)); - break; } return this; From 2374b802e0ba5d6a01a6dd3a3e7a5e65b3800b5f Mon Sep 17 00:00:00 2001 From: nisha Date: Sat, 8 Feb 2025 12:37:11 +0530 Subject: [PATCH 74/81] Updated default email in production properties --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 ++++++- src/main/resources/application-production.properties | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f43a030f..0fafe735 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1124,8 +1124,13 @@ public class ApplicationDao { } emailLogRequest.setRecipientEmails(hub.getEmail()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); + List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) + .map(String::trim) + .filter(email -> !email.isEmpty()) + .toList(); + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); + emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index c6a9cce8..cbf5dd3d 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -16,7 +16,7 @@ spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production isMailSendingEnabled = true -default_System_Receiver_Email=c.moretti@gepafin.it +default_System_Receiver_Email=m.gaudino@gepafin.it,f.marinelli@gepafin.it gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net From e9200c6fb38f86c568e4f0caf423a65d3e9ca15c Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 10 Feb 2025 14:56:47 +0530 Subject: [PATCH 75/81] Done ticket GEPAFINBE-153 --- .../constants/GepafinConstant.java | 13 ++ .../tendermanagement/dao/ApplicationDao.java | 23 ++- .../tendermanagement/dao/DashboardDao.java | 160 ++++++++++++++---- .../enums/UserActionContextEnum.java | 1 + .../ApplicationPageableRequestBean.java | 2 + .../model/response/ApplicationWidget.java | 19 +++ .../BeneficiaryStatisticsResponseBean.java | 17 ++ .../repositories/ApplicationRepository.java | 63 +++++++ .../service/DashboardService.java | 8 +- .../service/impl/DashboardServiceImpl.java | 13 +- .../web/rest/api/DashboardApi.java | 20 ++- .../rest/api/impl/DashboardApiController.java | 15 +- src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 2 +- 14 files changed, 300 insertions(+), 58 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationWidget.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/BeneficiaryStatisticsResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 3170aafd..ce019638 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -405,5 +405,18 @@ public class GepafinConstant { public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; + + + public static final String REQUESTED_VS_APPROVED_AMOUNTS="requestedVsApprovedAmount"; + public static final String MONTH="month"; + public static final String TOTAL_REQUESTED="totalRequested"; + public static final String TOTAL_APPROVED="totalApproved"; + + public static final String NUMBER_OF_APPLICATION="numberOfApplication"; + + + public static final String COMPANY_ID_NOT_NULL_MSG = "company.id.not.null"; + public static final String USER_WITH_COMPANY="userWithCompany"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 174313ca..7d15e8b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1404,6 +1404,9 @@ public class ApplicationDao { public PageableResponseBean> getAllApplicationByPagination(UserEntity userEntity, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { Integer pageNo = null; Integer pageLimit = null; + + UserWithCompanyEntity userWithCompany= userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId).orElse(null); + if (applicationPageableRequestBean.getGlobalFilters() != null) { pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); @@ -1414,7 +1417,7 @@ public class ApplicationDao { if (pageNo == null || pageNo <= 0) { pageNo = GepafinConstant.DEFAULT_PAGE; } - Specification spec = search(callId, companyId, applicationPageableRequestBean, userEntity); + Specification spec = search(callId,companyId, userWithCompany.getId(), applicationPageableRequestBean, userEntity); Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); // Prepare the response @@ -1437,10 +1440,10 @@ public class ApplicationDao { return pageableResponseBean; } - public Specification search(Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { + public Specification search(Long callId, Long companyId, Long userWithCompanyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { return (root, query, criteriaBuilder) -> { - List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId, companyId, userEntity); + List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId,companyId, userWithCompanyId, userEntity); SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); if (applicationPageableRequestBean.getGlobalFilters() != null @@ -1464,13 +1467,15 @@ public class ApplicationDao { private List getPredicates(ApplicationPageableRequestBean applicationPageableRequestBean, - CriteriaBuilder criteriaBuilder, Root root, Long callId, Long companyId, UserEntity userEntity) { + CriteriaBuilder criteriaBuilder, Root root, Long callId,Long companyId, Long userWithCompanyId, UserEntity userEntity) { Integer year = null; String search = null; + Integer daysRange = null; if (applicationPageableRequestBean.getGlobalFilters() != null) { year = applicationPageableRequestBean.getGlobalFilters().getYear(); search = applicationPageableRequestBean.getGlobalFilters().getSearch(); + daysRange = applicationPageableRequestBean.getDaysRange(); } List predicates = new ArrayList<>(); @@ -1512,16 +1517,24 @@ public class ApplicationDao { } // Optional companyId filter + if (userWithCompanyId != null) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_WITH_COMPANY).get(GepafinConstant.ID), userWithCompanyId)); + } if (companyId != null) { predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.COMPANY_ID), companyId)); } + + if (daysRange != null && daysRange >= 0) { + LocalDateTime today = LocalDateTime.now(); + LocalDateTime pastDate = today.minusDays(daysRange); + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), pastDate, today)); + } predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); return predicates; - } public void checkCallEndDate(CallEntity call) { LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index d88319e1..31468d57 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -61,7 +61,7 @@ public class DashboardDao { SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); widgetResponseBean.setWidget1(createWidget1(requestedUserEntity)); Map widgetBars =getStatistics(requestedUserEntity); - widgetResponseBean.setWidgetBars(widgetBars); + widgetResponseBean.setWidgetBars(widgetBars); return widgetResponseBean; } @@ -193,7 +193,7 @@ public class DashboardDao { return stats; } -// public Page getUserAction(UserEntity requestedUserEntity){ + // public Page getUserAction(UserEntity requestedUserEntity){ // Pageable pageable = PageRequest.of(0, 20); // Get the first 20 records // List roles=List.of(RoleStatusEnum.ROLE_PRE_INSTRUCTOR.getValue(),RoleStatusEnum.ROLE_GEPAFIN_OPERATOR.getValue(),RoleStatusEnum.ROLE_INSTRUCTOR_MANAGER.getValue()); // Page userActionEntities=userActionsRepository.findActionsByRoleNamesAndHubId(roles,requestedUserEntity.getHub().getId(),pageable); @@ -274,16 +274,16 @@ public class DashboardDao { .build(); } - public AmendmentWidgetResponseBean getAmendmentDetails(UserEntity userEntity) { - AmendmentWidgetResponseBean amendmentWidgetResponseBean = initializeAmendmentResponseBean(); + public AmendmentWidgetResponseBean getAmendmentDetails(UserEntity userEntity) { + AmendmentWidgetResponseBean amendmentWidgetResponseBean = initializeAmendmentResponseBean(); - Long hubId = userEntity.getHub().getId(); + Long hubId = userEntity.getHub().getId(); List applicationIds = getApplicationIdsForUserOrHub(userEntity,hubId); setAmendmentCounts(applicationIds,amendmentWidgetResponseBean, hubId); calculateExpiringRequestsIn48Hours(applicationIds,amendmentWidgetResponseBean, hubId); calculateAverageResponseDays(applicationIds,amendmentWidgetResponseBean,hubId); - return amendmentWidgetResponseBean; - } + return amendmentWidgetResponseBean; + } public List getApplicationIdsForUserOrHub(UserEntity userEntity, Long hubId) { if (validator.checkIsPreInstructor()) { return assignedApplicationsRepository.findApplicationIdsByUserIdAndIsDeletedFalse(userEntity.getId()); @@ -294,27 +294,27 @@ public class DashboardDao { private void setAmendmentCounts(List applicationIds,AmendmentWidgetResponseBean responseBean, Long hubId) { - Long totalAmendment = applicationAmendmentRequestRepository.countAmendmentsByApplicationIds(applicationIds); - if (totalAmendment != null) { - responseBean.setTotalAmendments(totalAmendment); - } + Long totalAmendment = applicationAmendmentRequestRepository.countAmendmentsByApplicationIds(applicationIds); + if (totalAmendment != null) { + responseBean.setTotalAmendments(totalAmendment); + } - Long awaitingAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( - applicationIds, ApplicationAmendmentRequestEnum.AWAITING.getValue()); - if (awaitingAmendments != null) { - responseBean.setWaitingForResponseAmendments(awaitingAmendments); - } - Long responseRecievedAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( - applicationIds, ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); - if (responseRecievedAmendments != null) { - responseBean.setResponseReceivedAmendments(responseRecievedAmendments); - } - Long expiredAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( - applicationIds, ApplicationAmendmentRequestEnum.EXPIRED.getValue()); - if (expiredAmendments != null) { - responseBean.setExpiredAmendments(expiredAmendments); - } - } + Long awaitingAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.AWAITING.getValue()); + if (awaitingAmendments != null) { + responseBean.setWaitingForResponseAmendments(awaitingAmendments); + } + Long responseRecievedAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + if (responseRecievedAmendments != null) { + responseBean.setResponseReceivedAmendments(responseRecievedAmendments); + } + Long expiredAmendments = applicationAmendmentRequestRepository.countAmendmentsByApplicationIdsAndStatus( + applicationIds, ApplicationAmendmentRequestEnum.EXPIRED.getValue()); + if (expiredAmendments != null) { + responseBean.setExpiredAmendments(expiredAmendments); + } + } private void calculateExpiringRequestsIn48Hours(List applicationIds ,AmendmentWidgetResponseBean responseBean, Long hubId) { @@ -354,8 +354,8 @@ public class DashboardDao { } public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(UserEntity userEntity) { - Long userId = userEntity.getId(); - Long hubId = userEntity.getHub().getId(); + Long userId = userEntity.getId(); + Long hubId = userEntity.getHub().getId(); Object[] results; List applicationIds; @@ -403,7 +403,107 @@ public class DashboardDao { return response; } + public static List getStatusList() { + return List.of( + ApplicationStatusTypeEnum.SUBMIT.getValue(), + ApplicationStatusTypeEnum.EVALUATION.getValue(), + ApplicationStatusTypeEnum.APPROVED.getValue(), + ApplicationStatusTypeEnum.REJECTED.getValue(), + ApplicationStatusTypeEnum.SOCCORSO.getValue(), + ApplicationStatusTypeEnum.APPOINTMENT.getValue(), + ApplicationStatusTypeEnum.NDG.getValue(), + ApplicationStatusTypeEnum.ADMISSIBLE.getValue() + ); + } + public BeneficiaryStatisticsResponseBean getStatisticsPageForBeneficiary(UserEntity userEntity, CompanyEntity company) { + BeneficiaryStatisticsResponseBean widgetResponseBean = initializeBeneficiaryStatisticsBean(); + UserWithCompanyEntity userWithCompanyEntity = companyService.getUserWithCompany(userEntity.getId(), company.getId()); + Long hubId = userEntity.getHub().getId(); + List statusList = getStatusList(); + Long submittedApplication = applicationRepository.countSubmittedApplicationsByHubIdAndUserId(hubId, userEntity.getId(), userWithCompanyEntity.getId(),statusList); + Long approvedApplication = getApplicationCountByStatus(hubId, userEntity.getId(), userWithCompanyEntity.getId(), ApplicationStatusTypeEnum.APPROVED); + BigDecimal successRate = getSuccessRate(hubId, userEntity.getId(), userWithCompanyEntity.getId()); + BigDecimal totalAmountRequested = applicationRepository.sumAmountRequestedByHubIdAndUserId(hubId, userEntity.getId(), userWithCompanyEntity.getId()); + + updateApplicationWidget(widgetResponseBean.getApplicationWidget(), submittedApplication, approvedApplication, successRate,totalAmountRequested); + + Map widgetBars = getApplicationStatistics(userEntity,userWithCompanyEntity.getId()); + widgetResponseBean.setApplicationWidgetBars(widgetBars); + return widgetResponseBean; + } + private BeneficiaryStatisticsResponseBean initializeBeneficiaryStatisticsBean() { + return BeneficiaryStatisticsResponseBean.builder() + .applicationWidget(ApplicationWidget.builder() + .submittedApplication(0L) + .approvedApplication(0L) + .successRate(BigDecimal.ZERO) + .totalAmountFinanced(BigDecimal.ZERO) + .build()) + .build(); + } + private Long getApplicationCountByStatus(Long hubId, Long userId, Long userWithCompanyId, ApplicationStatusTypeEnum status) { + return applicationRepository.countSubmittedApplicationsByHubIdAndUserIdAndStatus(hubId, userId, userWithCompanyId, status.getValue()); + } + private BigDecimal getSuccessRate(Long hubId, Long userId, Long userWithCompanyId) { + return applicationRepository.findSuccessRateByHubIdAndUserIdAndUserWithCompanyId(hubId, userId, userWithCompanyId); + } + private void updateApplicationWidget(ApplicationWidget applicationWidget, Long submittedApplication, Long approvedApplication, BigDecimal successRate, BigDecimal totalAmountRequested) { + applicationWidget.setSubmittedApplication(submittedApplication != null ? submittedApplication : 0L); + applicationWidget.setApprovedApplication(approvedApplication != null ? approvedApplication : 0L); + applicationWidget.setSuccessRate(successRate != null ? successRate : BigDecimal.ZERO); + applicationWidget.setTotalAmountFinanced(totalAmountRequested != null ? totalAmountRequested : BigDecimal.ZERO); + } + + public Map getApplicationStatistics(UserEntity requestedUser,Long userWithCompanyId) { + Map stats = new HashMap<>(); + + Map statusData = new HashMap<>(); + for (ApplicationStatusTypeEnum status : ApplicationStatusTypeEnum.values()) { + statusData.put(status.name(), 0L); + } + + // Get applications per status + List applicationsByStatus = applicationRepository.findApplicationsByStatusAndUserIdAndUserWithCompanyId( + requestedUser.getHub().getId(), + requestedUser.getId(), + userWithCompanyId + ); + + applicationsByStatus.forEach(result -> { + String status = (String) result[0]; + Long count = (Long) result[1]; + statusData.put(status, count); + }); + + List> statusList = statusData.entrySet().stream().map(entry -> { + Map statusMap = new HashMap<>(); + statusMap.put(GepafinConstant.STATUS, entry.getKey()); + statusMap.put(GepafinConstant.NUMBER_OF_APPLICATION, entry.getValue()); + return statusMap; + }).collect(Collectors.toList()); + + stats.put(GepafinConstant.APPLICATION_PER_STATUS, statusList); + + + // Requested VS Approved Amounts + List requestedVsApprovedAmounts = applicationRepository.findRequestedVsApprovedAmountsPerMonth( + requestedUser.getHub().getId(), + requestedUser.getId(), + userWithCompanyId + ); + + stats.put(GepafinConstant.REQUESTED_VS_APPROVED_AMOUNTS, requestedVsApprovedAmounts.stream().map(result -> { + Map data = new HashMap<>(); + data.put(GepafinConstant.MONTH, result[0]); + data.put(GepafinConstant.TOTAL_REQUESTED, result[1]); + data.put(GepafinConstant.TOTAL_APPROVED, result[2]); + return data; + }).toList()); -} + + return stats; + } + +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 4a4d1109..bdae22ca 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -145,6 +145,7 @@ public enum UserActionContextEnum { GET_APPLICATION_DETAILS("GET_APPLICATION_DETAILS"), GET_AMENDMENT_DETAILS("GET_AMENDMENT_DETAILS"), GET_APPLICATION_DETAILS_FOR_EVALUATION("GET_APPLICATION_DETAILS_FOR_EVALUATION"), + GET_STATISTICS_PAGE_FOR_BENEFICIARY("GET_STATISTICS_PAGE_FOR_BENEFICIARY"), /** Evaluation criteria action context **/ GET_EVALUATION_CRITERIA("GET_EVALUATION_CRITERIA"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java index dcb2aebc..153164d6 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java @@ -10,5 +10,7 @@ public class ApplicationPageableRequestBean { private GlobalFilters globalFilters; + private Integer daysRange; + private List status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationWidget.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationWidget.java new file mode 100644 index 00000000..0cad7598 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationWidget.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Builder +public class ApplicationWidget { + + private Long submittedApplication; + + private BigDecimal successRate; + + private Long approvedApplication; + + private BigDecimal totalAmountFinanced; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/BeneficiaryStatisticsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/BeneficiaryStatisticsResponseBean.java new file mode 100644 index 00000000..c9e88ef2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/BeneficiaryStatisticsResponseBean.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Map; + +@Data +@Builder +public class BeneficiaryStatisticsResponseBean { + + + private ApplicationWidget applicationWidget; + + private Map applicationWidgetBars; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 086b0807..67ff18cd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -92,5 +92,68 @@ public interface ApplicationRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); + @Query("SELECT CASE WHEN COUNT(CASE WHEN a.submissionDate IS NOT NULL THEN 1 ELSE NULL END) > 0 THEN " + + "CAST((SUM(CASE WHEN a.status = 'APPROVED' THEN 1 ELSE 0 END) * 100.0) / " + + "COUNT(CASE WHEN a.submissionDate IS NOT NULL THEN 1 ELSE NULL END) AS BigDecimal) " + + "ELSE CAST(0 AS BigDecimal) END " + + "FROM ApplicationEntity a " + + "WHERE a.hubId = :hubId AND a.userId = :userId AND a.userWithCompany.id = :userWithCompanyId " + + "AND a.isDeleted = false") + BigDecimal findSuccessRateByHubIdAndUserIdAndUserWithCompanyId( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId); + + @Query("SELECT a.status, COUNT(a.id) FROM ApplicationEntity a WHERE a.isDeleted = false AND a.userId = :userId AND a.userWithCompany.id = :userWithCompanyId AND a.call.hub.id = :hubId GROUP BY a.status") + List findApplicationsByStatusAndUserIdAndUserWithCompanyId(@Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId); + + @Query(""" + SELECT TO_CHAR(a.submissionDate, 'Mon') AS month, + SUM(a.amountRequested) AS totalRequested, + SUM(a.amountAccepted) AS totalApproved + FROM ApplicationEntity a + WHERE a.isDeleted = false + AND a.status = 'APPROVED' + AND a.call.hub.id = :hubId + AND a.userId = :userId + AND a.userWithCompany.id = :userWithCompanyId + GROUP BY TO_CHAR(a.submissionDate, 'Mon'), EXTRACT(YEAR FROM a.submissionDate), EXTRACT(MONTH FROM a.submissionDate) + ORDER BY EXTRACT(YEAR FROM a.submissionDate), EXTRACT(MONTH FROM a.submissionDate) +""") + List findRequestedVsApprovedAmountsPerMonth( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId + ); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a " + + "WHERE a.hubId = :hubId " + + "AND a.userId = :userId " + + "AND a.userWithCompany.id = :userWithCompanyId " + + "AND a.isDeleted = false " + + "AND a.status IN :statusList " + + "AND a.submissionDate IS NOT NULL") + Long countSubmittedApplicationsByHubIdAndUserId( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId, + @Param("statusList") List statusList + ); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a " + + "WHERE a.hubId = :hubId " + + "AND a.userId = :userId " + + "AND a.userWithCompany.id = :userWithCompanyId " + + "AND a.status = :status " + + "AND a.isDeleted = false") + Long countSubmittedApplicationsByHubIdAndUserIdAndStatus( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId, + @Param("status") String status); + @Query("SELECT SUM(a.amountAccepted) FROM ApplicationEntity a WHERE a.hubId = :hubId AND a.userId = :userId AND a.status = 'APPROVED' AND a.userWithCompany.id = :userWithCompanyId AND a.isDeleted = false") + BigDecimal sumAmountRequestedByHubIdAndUserId(@Param("hubId") Long hubId, @Param("userId") Long userId, @Param("userWithCompanyId") Long userWithCompanyId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java index f2076f0c..713a83c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DashboardService.java @@ -1,11 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; public interface DashboardService { @@ -16,4 +12,6 @@ public interface DashboardService { public AmendmentWidgetResponseBean getAmendmentDetails(HttpServletRequest request); public AssignedApplicationWidgetResponseBean getApplicationDetailsForEvaluation(HttpServletRequest request); + public BeneficiaryStatisticsResponseBean getStatisticsPageForBeneficiary(HttpServletRequest request,Long companyId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index a3cf0482..5dca39fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -4,11 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DashboardDao; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.DashboardService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; @@ -52,4 +48,11 @@ public class DashboardServiceImpl implements DashboardService { UserEntity userEntity = validator.validateUser(request); return dashboardDao.getApplicationDetailsForEvaluation(userEntity); } + + @Override + public BeneficiaryStatisticsResponseBean getStatisticsPageForBeneficiary(HttpServletRequest request, Long companyId) { + UserEntity userEntity = validator.validateUser(request); + CompanyEntity company = validator.validateUserWithCompany(request, companyId); + return dashboardDao.getStatisticsPageForBeneficiary(userEntity,company); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java index 2fe77d1b..16a81c1d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DashboardApi.java @@ -6,11 +6,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -90,5 +86,17 @@ public interface DashboardApi { produces = { "application/json" }) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") ResponseEntity> getApplicationDetailsForEvaluation(HttpServletRequest request); - + @Operation(summary = "Api to get Statistics page for beneficiary", + 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 = "/beneficiary/statistic/company/{companyId}", + produces = { "application/json" }) + ResponseEntity> getStatisticsPageForBeneficiary(HttpServletRequest request, + @Parameter(description = "The company id", required = true) @PathVariable(value = "companyId", required = true) Long companyId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java index 7a4a489c..0f299122 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DashboardApiController.java @@ -6,11 +6,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.AmendmentWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.AssignedApplicationWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; -import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.DashboardService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -83,6 +79,15 @@ public class DashboardApiController implements DashboardApi { return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } + @Override + public ResponseEntity> getStatisticsPageForBeneficiary(HttpServletRequest request, Long companyId) { + /** This code is responsible for creating user action logs for the "Get statistics page for beneficiary" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_STATISTICS_PAGE_FOR_BENEFICIARY).build()); + + BeneficiaryStatisticsResponseBean widgetResponseBean= dashboardService.getStatisticsPageForBeneficiary(request, companyId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 451dec92..b3c5f259 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -365,5 +365,5 @@ evaluation.form.not.found=Evaluation form not found. assigned.application.status.updated.successfully=Assigned application status updated successfully. validation.required.requested.amount=The Requested Amount configuration should be mandatory. - +company.id.not.null=Company ID cannot be null. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 66595c92..3ba36fcf 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -356,6 +356,6 @@ evaluation.form.not.found=Modulo di valutazione non trovato. assigned.application.status.updated.successfully=Stato dell'applicazione assegnata aggiornato con successo. validation.required.requested.amount=La configurazione dell'importo richiesto č obbligatoria. - +company.id.not.null=L'ID dell'azienda non pu? essere nullo. From bba7efe6dbe60ea729fbf8e4036b16690761d396 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 10 Feb 2025 20:27:17 +0530 Subject: [PATCH 76/81] Updated null to 0 --- .../java/net/gepafin/tendermanagement/dao/DashboardDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 0e7f7802..29304f15 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -510,8 +510,8 @@ public class DashboardDao { stats.put(GepafinConstant.REQUESTED_VS_APPROVED_AMOUNTS, requestedVsApprovedAmounts.stream().map(result -> { Map data = new HashMap<>(); data.put(GepafinConstant.MONTH, result[0]); - data.put(GepafinConstant.TOTAL_REQUESTED, result[1]); - data.put(GepafinConstant.TOTAL_APPROVED, result[2]); + data.put(GepafinConstant.TOTAL_REQUESTED, result[1]!= null ? result[1] : 0L); + data.put(GepafinConstant.TOTAL_APPROVED, result[2] != null ? result[2] : 0L); return data; }).toList()); return stats; From acab068ef1b10597b22a78214cca906863fae92f Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 11 Feb 2025 11:38:56 +0530 Subject: [PATCH 77/81] Done ticket GEPAFINBE-166 --- .../constants/GepafinConstant.java | 92 ++++++------------- .../dao/EmailNotificationDao.java | 14 +-- .../dao/SystemEmailTemplatesDao.java | 6 +- .../entities/SystemEmailTemplatesEntity.java | 7 +- .../SystemEmailTemplatesRespository.java | 3 + .../db/changelog/db.changelog-1.0.0.xml | 20 ++++ ...nt_mail_notification_mail_31_01_2024_1.sql | 65 +++++++++++++ 7 files changed, 126 insertions(+), 81 deletions(-) create mode 100644 src/main/resources/db/dump/insert_system_email_template_for_updating_amendment_mail_notification_mail_31_01_2024_1.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 80f30960..35b2d6c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -180,27 +180,27 @@ public class GepafinConstant { public static final String UNAUTHORIZED = "UNAUTHORIZED"; public static final String COMPANY_ID_MANDATORY = "company.id.mandatory"; public static final String USER_ALREADY_CONNECTED_TO_COMPANY = "user.already.connected.to.company"; - public static final String YYYY_MM_DD_DASH = "yyyy-MM-dd"; - public static final String YYYY_MM_DD_SLASH = "yyyy/MM/dd"; - public static final String DELEGATION_TEMPLATE = "DELEGATION_TEMPLATE"; - public static final String VALIDATION_ERROR_MISSING_FIRSTNAME = "validation.error.missing.firstName"; - public static final String VALIDATION_ERROR_MISSING_LASTNAME = "validation.error.missing.lastName"; - public static final String VALIDATION_ERROR_MISSING_CODICEFISCALE = "validation.error.missing.codiceFiscale"; - public static final String DELEGATION_FILE_UPLOAD_SUCCESS = "delegation.file.upload.success"; - public static final String DELEGATION_FETCH_SUCCESS = "delegation.fetch.success"; - public static final String DELEGATION_TEMPLATE_GENERATION_ERROR = "delegation.template.generation.error"; - public static final String VALIDATION_ERROR_FILE_EMPTY = "validation.error.file.empty"; - public static final String VALIDATION_ERROR_FILE_INVALIDTYPE = "validation.error.file.invalidType"; - public static final String UPLOAD_ERROR_S3 = "upload.error.s3"; + public static final String YYYY_MM_DD_DASH = "yyyy-MM-dd"; + public static final String YYYY_MM_DD_SLASH = "yyyy/MM/dd"; + public static final String DELEGATION_TEMPLATE = "DELEGATION_TEMPLATE"; + public static final String VALIDATION_ERROR_MISSING_FIRSTNAME = "validation.error.missing.firstName"; + public static final String VALIDATION_ERROR_MISSING_LASTNAME = "validation.error.missing.lastName"; + public static final String VALIDATION_ERROR_MISSING_CODICEFISCALE = "validation.error.missing.codiceFiscale"; + public static final String DELEGATION_FILE_UPLOAD_SUCCESS = "delegation.file.upload.success"; + public static final String DELEGATION_FETCH_SUCCESS = "delegation.fetch.success"; + public static final String DELEGATION_TEMPLATE_GENERATION_ERROR = "delegation.template.generation.error"; + public static final String VALIDATION_ERROR_FILE_EMPTY = "validation.error.file.empty"; + public static final String VALIDATION_ERROR_FILE_INVALIDTYPE = "validation.error.file.invalidType"; + public static final String UPLOAD_ERROR_S3 = "upload.error.s3"; public static final String CALL_NOT_STARTED_YET = "call.not.started.yet"; public static final String CALL_ALREADY_ENDED = "call.already.ended"; public static final String APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "application.status.updated.successfully"; public static final String APPLICATION_ALREADY_IN_PREVIOUS_STATUS = "application.already.in.provided.status"; - public static final String DELEGATION_NOT_FOUND = "delegation.not.found"; - public static final String USER_COMPANY_RELATION_NOT_FOUND = "user.company.relation.not.found"; - public static final String DELEGATION_DELETE_SUCCESS = "delegation.delete.success"; - public static final String HH_MM_SS = "HH:mm:ss"; + public static final String DELEGATION_NOT_FOUND = "delegation.not.found"; + public static final String USER_COMPANY_RELATION_NOT_FOUND = "user.company.relation.not.found"; + public static final String DELEGATION_DELETE_SUCCESS = "delegation.delete.success"; + public static final String HH_MM_SS = "HH:mm:ss"; public static final String USER_NOT_AUTHORIZED_TO_CREATE_APPLICATION = "user.not.authorized.create.application"; public static final String APPLICATION_SUBMITTED_CANNOT_CHANGE = "application.submitted.cannot.change"; @@ -218,11 +218,11 @@ public class GepafinConstant { public static final String USER_ID_AND_BENEFICIARY_ID_ERROR = "userId.and.beneficiaryId.error"; public static final String EITHER_USER_OR_BENEFICIARY_ID_REQUIRED = "either.user.or.beneficiary.id.required"; public static final String USER_NOT_FOUND_WITH_BENEFICIARYID_MSG = "User.not.found.with.the.given.beneficiaryID"; - public static final String PERMISSION_DENIED = "permission.denied"; - public static final String SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS = "signed.document.file.upload.success"; - public static final String GET_SIGNED_DOCUMENT_FILE_SUCCESS = "get.signed.document.file.success"; - public static final String APPLICATION_SIGNED_DOCUMENT_NOT_FOUND = "application.signed.document.not.found"; - public static final String DELETE_SIGNED_DOCUMENT_FILE_SUCCESS = "delete.signed.document.file.success"; + public static final String PERMISSION_DENIED = "permission.denied"; + public static final String SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS = "signed.document.file.upload.success"; + public static final String GET_SIGNED_DOCUMENT_FILE_SUCCESS = "get.signed.document.file.success"; + public static final String APPLICATION_SIGNED_DOCUMENT_NOT_FOUND = "application.signed.document.not.found"; + public static final String DELETE_SIGNED_DOCUMENT_FILE_SUCCESS = "delete.signed.document.file.success"; public static final String DD_MM_YYYY = "dd/MM/yyyy"; public static final String DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY="dashboard.widget.fetched.successfully"; @@ -251,16 +251,16 @@ public class GepafinConstant { public static final String DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.deleted.success"; public static final String GET_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.get.success"; public static final String ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG = "assigned.application.update.successfully"; - + public static final String HUB_CREATE_SUCCESS = "hub_create_success"; public static final String HUB_UPDATE_SUCCESS = "hub_update_success"; public static final String HUB_GET_SUCCESS = "hub_get_success"; public static final String HUB_GET_ALL_SUCCESS = "hub_get_all_success"; public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; public static final String HUB_NOT_FOUND = "hub_not_found"; - public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; + public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; - public static final String GET_ERROR_S3 = "get.error.s3"; + public static final String GET_ERROR_S3 = "get.error.s3"; public static final String BENEFICIARY_EMAIL_NOT_FOUND_MSG = "beneficiary.email.not.found.msg"; public static final String ADDED_S3_PATH_STRUCTURE ="added.s3.path.structure"; public static final String S3_PATH_STRUCTURE_BY_TYPE ="fetched.s3.path.structure.by.type.successfully"; @@ -391,7 +391,7 @@ public class GepafinConstant { public static final String NON_EMPTY_TABLES="nonEmptyTables"; public static final String VALIDATION_IN_TABLE = "validation.table.message"; public static final String CALL_EXPIRED="call.expired"; - public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; + public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; @@ -410,44 +410,8 @@ public class GepafinConstant { public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; public static final String FORMULA_AMOUNT_NOT_MATCHED="formula.amount.not.matches.requested.amount"; public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; - - public static final String DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA= "\n" + - " \n" + - "
\n" + - "

RICHIESTA INTEGRAZIONE DOCUMENTALE

\n" + - "

Buongiorno,

\n" + - "

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Bando \n" + - " “{{call_name}}“ di cui al Protocollo n. {{protocol_number}} del\n" + - " {{protocol_date}} e {{protocol_time}}, alla luce dell'attività istruttoria svolta,\n" + - " segnaliamo quanto segue:\n" + - "

\n" + - " {{note}}\n" + - "

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione caricandola all'interno dello sportello\n" + - " online {{platform_link}} entro e non oltre {{response_days}} giorni dal ricevimento della presente comunicazione,\n" + - " precisando che, in caso di mancata ricezione nei termini indicati, saremo costretti a non prendere in considerazione la Vostra richiesta di finanziamento.\n" + - "

\n" + - "

La documentazione trasmessa e le informazioni fornite saranno processate dall'istruttore assegnatario della pratica.\n" + - "

\n" + - "

Distinti Saluti,

\n" + - "

{{email_signature}}

\n" + - "
\n" + - " \n" + - ""; - - - public static final String APPLICATION_REJECTED_SVILUPPUMBRIA = "\n" + - " \n" + - "
\n" + - "

Buongiorno,

\n" + - "

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al\n" + - " Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}},\n" + - " la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

\n" + - "

Le motivazioni sono le seguenti: {{form_text}}

\n" + - "

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno finoltrare richiesta di chiarimenti e/o osservazioni alla scrivente Società ai sensi e per gli effetti dell’art.10 bis della L.241/1990 e s.m.i.

\n" + - "

Distinti Saluti,

\n" + - "

{{email_signature}}

\n" + - "
\n" + - " \n" + - ""; } + + + diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 8133e5f7..3988b35a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -94,19 +94,7 @@ public class EmailNotificationDao { subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); // bodyPlaceholders.put("{{legal_mail}}", legalMail); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body; - if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST)) { - bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); - bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); - body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); - } - else if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { - bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); - body = Utils.replacePlaceholders(GepafinConstant.APPLICATION_REJECTED_SVILUPPUMBRIA, bodyPlaceholders); - } - else { - body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - } + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); return new EmailContentResponse(subject, body, systemEmailTemplateResponse); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java index 514506f5..8808abfd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java @@ -33,10 +33,10 @@ public class SystemEmailTemplatesDao { public SystemEmailTemplateResponse retrieveTemplate(SystemEmailTemplatesEntityTypeEnum type, HubEntity hub, Locale language) { SystemEmailTemplatesEntity dbSystemEmailTemplatesEntity = null; if(hub != null){ -// dbSystemEmailTemplatesEntity = systemEmailTemplatesRespository -// .findByTypeAndCallId(type.getValue(), call.getId()); + dbSystemEmailTemplatesEntity = systemEmailTemplatesRespository + .findByTypeAndHubEntityId(type.getValue(), hub.getId()); } - if(dbSystemEmailTemplatesEntity == null) { + if(dbSystemEmailTemplatesEntity == null){ dbSystemEmailTemplatesEntity = systemEmailTemplatesRespository .findByType(type.getValue()); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index dac3a432..8a3c964b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -38,7 +38,12 @@ public class SystemEmailTemplatesEntity extends BaseEntity { @Column(name = "email_scenario") private String emailScenario; - + + @ManyToOne + @JoinColumn(name = "HUB_ID") + private HubEntity hubEntity; + + public enum SystemEmailTemplatesEntityTypeEnum { APPLICATION_SUBMISSION_TO_USER_AND_COMPANY("APPLICATION_SUBMISSION_TO_USER_AND_COMPANY"), diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SystemEmailTemplatesRespository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SystemEmailTemplatesRespository.java index 9e3e9bb9..d86c7216 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/SystemEmailTemplatesRespository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/SystemEmailTemplatesRespository.java @@ -13,5 +13,8 @@ public interface SystemEmailTemplatesRespository extends JpaRepository + + + + + + + + + + + + select + setval('gepafin_schema.system_email_template_id_seq', (select + max(id)+1 + from gepafin_schema.system_email_template), false) + + + diff --git a/src/main/resources/db/dump/insert_system_email_template_for_updating_amendment_mail_notification_mail_31_01_2024_1.sql b/src/main/resources/db/dump/insert_system_email_template_for_updating_amendment_mail_notification_mail_31_01_2024_1.sql new file mode 100644 index 00000000..e148c879 --- /dev/null +++ b/src/main/resources/db/dump/insert_system_email_template_for_updating_amendment_mail_notification_mail_31_01_2024_1.sql @@ -0,0 +1,65 @@ +INSERT INTO gepafin_schema.system_email_template (template_name, "type", html_content, subject, "json", "system", is_deleted, created_date, updated_date, email_scenario, hub_id) +VALUES +( + 'Instructional Aid/Request for Documentation Integration Template For Sviluppumbria', + 'DOCUMENTATION_INTEGRATION_REQUEST', + ' + +
+

RICHIESTA INTEGRAZIONE DOCUMENTALE

+

Buongiorno,

+

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Bando + "{{call_name}}" di cui al Protocollo n. {{protocol_number}} del + {{protocol_date}} e {{protocol_time}}, alla luce dell''attivitĂ  istruttoria svolta, + segnaliamo quanto segue: +

+ {{note}} +

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione caricandola all''interno dello sportello + online {{platform_link}} entro e non oltre {{response_days}} giorni dal ricevimento della presente comunicazione, + precisando che, in caso di mancata ricezione nei termini indicati, saremo costretti a non prendere in considerazione la Vostra richiesta di finanziamento. +

+

La documentazione trasmessa e le informazioni fornite saranno processate dall''istruttore assegnatario della pratica. +

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ', + 'BANDO {{call_name}}- Domanda di concessione di finanziamento agevolato {{company_name}}', + NULL, + false, + false, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP, + 'APPLICATION_AMENDMENT_REQUESTED', + 2 +); + +INSERT INTO gepafin_schema.system_email_template (template_name, "type", html_content, subject, "json", "system", is_deleted, created_date, updated_date, email_scenario, hub_id) +VALUES +( + 'Notification of Inadmissibility Template', + 'INADMISSIBILITY_NOTIFICATION', + ' + +
+

Buongiorno,

+

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, + la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

+

Le motivazioni sono le seguenti: {{form_text}}

+

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno finoltrare richiesta di chiarimenti e/o osservazioni alla scrivente Società ai sensi e per gli effetti dell’art.10 bis della L.241/1990 e s.m.i.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ', + 'BANDO {{call_name}} – Esito negativo istruttoria di ammissibilità {{company_name}}', + NULL, + false, + false, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP, + 'APPLICATION_REJECTED', + 2 +); \ No newline at end of file From 6bb531789a0d2276e54644f71ca0e56c6e5648c6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 11 Feb 2025 18:24:18 +0530 Subject: [PATCH 78/81] Changes in create Application api for gepafin --- .../tendermanagement/dao/ApplicationDao.java | 16 ++++++++++++++++ .../repositories/ApplicationRepository.java | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 35ecc113..fb2a1749 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -888,6 +888,10 @@ public class ApplicationDao { checkCallEndDate(call); // call = callService.validatePublishedCall(call.getId()); // checkIfApplicationExists(call, userWithCompanyEntity, userEntity); + HubEntity hubEntity = hubService.valdateHub(call.getHub().getId()); + if(hubEntity.getUniqueUuid().equals(defaultHubUuid)){ + checkIfApplicationExists(call, userWithCompanyEntity, userEntity); + } ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity); applicationEntity.setComments(applicationRequest.getComments()); applicationEntity = saveApplicationEntity(applicationEntity); @@ -900,6 +904,18 @@ public class ApplicationDao { // } // } + public void checkIfApplicationExists(CallEntity call, UserWithCompanyEntity userWithCompanyEntity, UserEntity userEntity){ + + List applications = applicationRepository.findByUserIdAndUserWithCompany_IdAndCall_IdAndIsDeletedFalseAndStatusNot( + userEntity.getId(), userWithCompanyEntity.getId(), call.getId(), ApplicationStatusTypeEnum.REJECTED.name() + ); + + if (!applications.isEmpty()) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS)); + } + } + + public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { ApplicationEntity applicationEntity = validateApplication(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 2434fac9..5ed76d55 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -158,4 +158,8 @@ public interface ApplicationRepository extends JpaRepository findByUserIdAndUserWithCompany_IdAndCall_IdAndIsDeletedFalseAndStatusNot( + Long userId, Long userWithCompanyId, Long callId, String status + ); } From 8a08fd6b3e95054afd31cbed2ab489c43bbf221d Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 11 Feb 2025 18:24:55 +0530 Subject: [PATCH 79/81] updated code --- .../net/gepafin/tendermanagement/entities/CallEntity.java | 4 ++-- .../model/request/CreateCallRequestStep1.java | 4 ++-- .../model/request/UpdateCallRequestStep1.java | 4 ++-- .../model/response/ApplicationEvaluationResponse.java | 4 ++-- .../model/response/AssignedApplicationsResponse.java | 4 ++-- .../model/response/CallDetailsResponseBean.java | 4 ++-- .../tendermanagement/model/response/CallResponse.java | 4 ++-- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 5 +++++ 8 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index a9098234..36c370d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -93,9 +93,9 @@ public class CallEntity extends BaseEntity { private String evaluationVersion; @Column(name = "NUMBER_OF_CHECK") - private BigDecimal numberOfCheck; + private Long numberOfCheck; @Column(name = "PRODUCT_ID") - private BigDecimal productId; + private Long productId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index ca8abd99..c54a1454 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -24,9 +24,9 @@ public class CreateCallRequestStep1 { private BigDecimal amountMax; - private BigDecimal numberOfCheck; + private Long numberOfCheck; - private BigDecimal productId; + private Long productId; private List aimedTo; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java index 2ebda4b5..ad55d544 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -41,9 +41,9 @@ public class UpdateCallRequestStep1 { private List faq; - private BigDecimal numberOfCheck; + private Long numberOfCheck; - private BigDecimal productId; + private Long productId; private EvaluationVersionEnum evaluationVersion; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 312e6f35..44f27c13 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -44,8 +44,8 @@ public class ApplicationEvaluationResponse { private BigDecimal amountAccepted; private LocalDateTime dateAccepted; private LocalDateTime dateRejected; - private BigDecimal numberOfCheck; - private BigDecimal productId; + private Long numberOfCheck; + private Long productId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 8597cafa..37311ff6 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -24,8 +24,8 @@ public class AssignedApplicationsResponse extends BaseBean { private LocalDateTime callEndDate; private String companyName; private LocalDateTime evaluationEndDate; - private BigDecimal numberOfCheck; - private BigDecimal productId; + private Long numberOfCheck; + private Long productId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 256a564b..76e892d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -57,9 +57,9 @@ public class CallDetailsResponseBean { private Long preferredCallId; - private BigDecimal numberOfCheck; + private Long numberOfCheck; - private BigDecimal productId; + private Long productId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index 6390e91c..a566ab37 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -50,9 +50,9 @@ public class CallResponse { private String phoneNumber; - private BigDecimal numberOfCheck; + private Long numberOfCheck; - private BigDecimal productId; + private Long productId; @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime startTime; diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index cb626eb9..37c34586 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2413,4 +2413,9 @@ + + + + + From 740b8b8725074dc709dfa242fe05d207ebb23b5c Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 12:40:47 +0530 Subject: [PATCH 80/81] Done ticket GEPAFINBE-168 --- .../tendermanagement/dao/ApplicationDao.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index fb2a1749..623d88c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1133,20 +1133,22 @@ public class ApplicationDao { // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); - if(validator.isProductionProfileActivated()) { - emailLogRequest.setRecipientEmails(carloEmail); + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { + if (validator.isProductionProfileActivated()) { + emailLogRequest.setRecipientEmails(carloEmail); // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); - } + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); + } + List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) + .map(String::trim) + .filter(email -> !email.isEmpty()) + .toList(); + + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); + emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail, emailLogRequest); + } emailLogRequest.setRecipientEmails(hub.getEmail()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); - List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) - .map(String::trim) - .filter(email -> !email.isEmpty()) - .toList(); - - emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } From ac27800c5094a747bdadf773a0dbe19fb9c1ac41 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 13 Feb 2025 14:46:31 +0530 Subject: [PATCH 81/81] Updated code --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 2c36b86c..ef01dea6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -153,7 +153,7 @@ public class ApplicationEvaluationDao { Long hubId = application.getHubId(); HubEntity hub = hubService.valdateHub(hubId); - Long initialDays = (hub != null) ? hub.getEvaluationExpirationDays() : 0L; + Long initialDays = (hub != null) ? hub.getEvaluationExpirationDays() : 30L; entity.setApplicationId(application.getId()); entity.setAssignedApplicationsEntity(assignedApplications); @@ -165,10 +165,10 @@ public class ApplicationEvaluationDao { entity.setMotivation(req.getMotivation()); entity.setIsDeleted(false); entity.setInitialDays(initialDays); - entity.setRemainingDays(30L); + entity.setRemainingDays(initialDays); entity.setSuspendedDays(0L); entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - entity.setEndDate(DateTimeUtil.DateServerToUTC(application.getSubmissionDate().plusDays(30))); + entity.setEndDate(DateTimeUtil.DateServerToUTC(application.getSubmissionDate().plusDays(initialDays))); entity.setEvaluationVersion(application.getEvaluationVersion()); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); return entity;