From 37bfe691ea64d5e88ea75f49ba6e11a64acef3c5 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 22 Jan 2025 13:53:35 +0530 Subject: [PATCH 01/50] Implementing pagination in few APIs --- .../constants/GepafinConstant.java | 3 + .../tendermanagement/dao/ApplicationDao.java | 16 +++ .../dao/AssignedApplicationsDao.java | 133 ++++++++++++++++-- .../tendermanagement/dao/NotificationDao.java | 45 ++++++ ...ssignedApplicationPageableRequestBean.java | 15 ++ .../service/AssignedApplicationsService.java | 3 + .../service/NotificationService.java | 7 +- .../impl/AssignedApplicationsServiceImpl.java | 8 ++ .../service/impl/NotificationServiceImpl.java | 5 + .../web/rest/api/AssignedApplicationsApi.java | 18 ++- .../web/rest/api/NotificationApi.java | 18 ++- .../impl/AssignedApplicationsController.java | 12 ++ .../api/impl/NotificationApiController.java | 7 + 13 files changed, 276 insertions(+), 14 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationPageableRequestBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 34a05ca6..f7f796b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -387,5 +387,8 @@ 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 PROTOCOL="protocol"; + public static final String PROTOCOL_NUMBER="protocolNumber"; + public static final String NOTE="note"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index ba847ca3..d4f6d3f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1493,6 +1493,22 @@ public class ApplicationDao { criteriaBuilder.upper(root.get(GepafinConstant.COMMENTS)), "%" + search.toUpperCase() + "%" ); +// Predicate protocolPredicate = criteriaBuilder.like( +// criteriaBuilder.function( +// "TO_CHAR", +// String.class, +// criteriaBuilder.function("CAST", String.class, root.get(GepafinConstant.PROTOCOL).get(GepafinConstant.PROTOCOL_NUMBER)) +// ), +// "%" + search + "%" +// ); + + Predicate callNamePredicate =criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.CALL).get(GepafinConstant.NAME)), // Adjust field name + "%" + search.toUpperCase() + "%" + ); + +// predicates.add(criteriaBuilder.or(protocolPredicate)); + predicates.add(criteriaBuilder.or(callNamePredicate)); predicates.add(criteriaBuilder.or(titlePredicate)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index cc281df7..217acd81 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -1,23 +1,20 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; 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.FaqEntity; -import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; -import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.*; 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.model.response.PageableResponseBean; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; @@ -32,16 +29,20 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio 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.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isEmpty; @Component public class AssignedApplicationsDao { @@ -257,5 +258,117 @@ public class AssignedApplicationsDao { log.info("Assigned application fetched successfully: {}", response); return response; } + public PageableResponseBean> getAllAssignedApplicationsByPagination(UserEntity user, AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean,Long userId) { + Integer pageNo = null; + Integer pageLimit = null; + if (assignedApplicationPageableRequestBean.getGlobalFilters() != null) { + pageNo = assignedApplicationPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = assignedApplicationPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = searchByPagination( assignedApplicationPageableRequestBean, user,userId); + Page entityPage = assignedApplicationsRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List assignedApplicationsResponses = entityPage.getContent().stream() + .map(application -> { + AssignedApplicationsResponse response = convertEntityToResponse(application); + return response; + }) + .collect(Collectors.toList()); + + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(assignedApplicationsResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification searchByPagination(AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean, UserEntity userEntity,Long userId) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(assignedApplicationPageableRequestBean, criteriaBuilder, root, userEntity,userId); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (assignedApplicationPageableRequestBean.getGlobalFilters() != null + && assignedApplicationPageableRequestBean.getGlobalFilters().getSortBy() != null && + assignedApplicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(assignedApplicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(assignedApplicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (assignedApplicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(assignedApplicationPageableRequestBean.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(AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity,Long userId) { + + Integer year = null; + String search = null; + if (assignedApplicationPageableRequestBean.getGlobalFilters() != null) { + year = assignedApplicationPageableRequestBean.getGlobalFilters().getYear(); + search = assignedApplicationPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + Boolean isBeneficiary = validator.checkIsBeneficiary(); + if (userId!=null) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userId)); + } + if (year != null && year > 0) { + int filterYear = assignedApplicationPageableRequestBean.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.NOTE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate)); + } + + // Filter by `status` (if status list is provided) + if (assignedApplicationPageableRequestBean.getStatus() != null && !assignedApplicationPageableRequestBean.getStatus().isEmpty()) { + List statusValues = assignedApplicationPageableRequestBean.getStatus().stream() + .map(AssignedApplicationEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + + + 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 3944246c..56749190 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -4,6 +4,7 @@ import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -400,4 +401,48 @@ public class NotificationDao { predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userId)); return predicates; } + + public PageableResponseBean> getNotificationsByUserIdAndCompanyIdByPagination(Long userId, Long companyId, NotificationRequestBean notificationRequestBean) { + UserWithCompanyEntity userWithCompany; + if (companyId != null) { + userWithCompany = companyDao.validateUserWithCompny(userId, companyId); + }else { + userWithCompany=null; + } + 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); + if(userWithCompany!=null){ + spec = spec.and((root, query, criteriaBuilder) -> + criteriaBuilder.equal(root.get("userWithCompany").get("id"), userWithCompany.getId())); +} + 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; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationPageableRequestBean.java new file mode 100644 index 00000000..89b13bd4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationPageableRequestBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; + +import java.util.List; + +@Data +public class AssignedApplicationPageableRequestBean { + + + private GlobalFilters globalFilters; + + private List 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..66afcf0b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -2,9 +2,11 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.model.request.AssignedApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import java.util.List; @@ -19,4 +21,5 @@ public interface AssignedApplicationsService { AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, UpdateAssignedApplicationRequest assignedApplicationsRequest); AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId); + PageableResponseBean> getAllAssignedApplicationsByPagination(HttpServletRequest request, Long userId, AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java index 940d753e..5267e736 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java @@ -7,7 +7,9 @@ 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 org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; import java.util.List; @@ -25,4 +27,7 @@ public interface NotificationService { public List getNotificationsByCompanyIdAndUserId(Long userId, Long companyId, List statuses); PageableResponseBean> getAllNotification(HttpServletRequest request,Long userId, NotificationRequestBean notificationRequestBean); -} + + PageableResponseBean> getNotificationsByUserIdAndCompanyIdByPagination(HttpServletRequest request, Long userId, Long companyId, NotificationRequestBean notificationRequestBean); + + } 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..5ac62dc5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -4,9 +4,11 @@ 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.model.request.AssignedApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; @@ -61,4 +63,10 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ return assignedApplicationsDao.validateAssignedApplication(assignedApplicationId); } + @Override + public PageableResponseBean> getAllAssignedApplicationsByPagination(HttpServletRequest request, Long userId, AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean) { + UserEntity user=validator.validateUser(request); + return assignedApplicationsDao.getAllAssignedApplicationsByPagination(user,assignedApplicationPageableRequestBean,userId); + } + } 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 bb9f167d..9bd5603d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java @@ -74,4 +74,9 @@ public class NotificationServiceImpl implements NotificationService { UserEntity userEntity = validator.validateUser(request); return notificationDao.getAllNotification(userId,notificationRequestBean); } + + @Override + public PageableResponseBean> getNotificationsByUserIdAndCompanyIdByPagination(HttpServletRequest request, Long userId, Long companyId, NotificationRequestBean notificationRequestBean) { + return notificationDao.getNotificationsByUserIdAndCompanyIdByPagination(userId,companyId,notificationRequestBean); + } } \ No newline at end of file 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..b09981e8 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,9 +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.model.request.AssignedApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +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.http.MediaType; @@ -55,7 +57,7 @@ public interface AssignedApplicationsApi { ResponseEntity> deleteAssignedApplication(HttpServletRequest request, @Parameter(description = "The assigned application id", required = true) @PathVariable("id") Long id); - @Operation(summary = "Api to get all assigned applications", + @Operation(summary = "Api to get all assigned applications (deprecated) ", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -96,8 +98,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 get all assigned applications 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", produces = "application/json") + ResponseEntity>>> getAllAssignedApplicationsByPagination(HttpServletRequest request, + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId, @RequestBody AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean); + } 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 44bc0e84..8cccb46c 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 @@ -87,7 +87,7 @@ public interface NotificationApi { ResponseEntity> deleteNotification(HttpServletRequest request, @Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id); - @Operation(summary = "API to get notifications by user ID and company ID", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @Operation(summary = "API to get notifications by user ID and company ID (deprecated) ", 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 = { @@ -110,6 +110,22 @@ public interface NotificationApi { @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); + + + + @Operation(summary = "API to get notifications by user ID and company ID 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}/company/{companyId}/notifications/pagination", produces = "application/json") + ResponseEntity>>> getNotificationsByUserIdAndCompanyIdByPagination(HttpServletRequest request, + @Parameter(description = "The user id", required = true) @PathVariable(value = "userId") Long userId, + @Parameter(description = "The company ID", required = true) @PathVariable(value = "companyId") Long companyId, + @RequestBody NotificationRequestBean notificationRequestBean); + } 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..18c30490 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 @@ -6,10 +6,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.AssignedApplicationPageableRequestBean; 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.AssignedApplicationsResponse; +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.AssignedApplicationsService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -89,6 +92,15 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } + @Override + public ResponseEntity>>> getAllAssignedApplicationsByPagination(HttpServletRequest request, Long userId, AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean) { + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_NOTIFICATION_BY_PAGINATION).build()); + + PageableResponseBean> notificationResponses=assignedApplicationsService.getAllAssignedApplicationsByPagination(request, userId,assignedApplicationPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); + + } + } 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 549b6517..8de800e1 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 @@ -92,4 +92,11 @@ public class NotificationApiController implements NotificationApi { return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); } + @Override + public ResponseEntity>>> getNotificationsByUserIdAndCompanyIdByPagination(HttpServletRequest request, Long userId, Long companyId, NotificationRequestBean notificationRequestBean) { + PageableResponseBean> notificationResponses=notificationService.getNotificationsByUserIdAndCompanyIdByPagination(request, userId,companyId,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 7887bb1d93c5637b193a46ac64ffed7338721982 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 11 Feb 2025 15:33:46 +0530 Subject: [PATCH 02/50] Updated Appointment code for creating appointment on external system. --- .../constants/AppointmentApiConstant.java | 16 ++++- .../constants/GepafinConstant.java | 2 +- .../tendermanagement/dao/AppointmentDao.java | 64 ++++++++++++++----- .../request/AppointmentCreationRequest.java | 4 +- .../feignClient/AppointmentApiService.java | 3 +- 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java index 15a3444e..c82687a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java @@ -6,7 +6,7 @@ public class AppointmentApiConstant { public static final String GET_NDG_BY_VAT_NUMBER = "/WSAnagrafica.getListaNdg"; public static final String CREATE_VISURA = "/WSAnagrafica.createVisura"; public static final String GET_VISURA_LIST = "/WSAnagrafica.getVisuraList"; - public static final String GET_APPOINTMENT_TEMPLATE = "/WSCrmConsulenza.getAppuntamentoTemplate?idAppuntamentoTemplate=7"; + public static final String GET_APPOINTMENT_TEMPLATE = "/WSCrmConsulenza.getAppuntamentoTemplate"; public static final String CREATE_APPOINTMENT_FROM_TEMPLATE = "/WSCrmConsulenza.createAppointmentFromTemplate"; public static final String UPLOAD_APOOINTMENT_DOCUMENT = "/WSDocumentDetail.createStream"; @@ -24,4 +24,18 @@ public class AppointmentApiConstant { public static final boolean IS_FROM_RATING = Boolean.FALSE; public static final boolean IS_ANAGRAFICA_LEGAME = Boolean.FALSE; + //Appointment creation request body fields + public static final String MOTIVAZIONE = "motivazione"; + public static final String COD_PRODOTTO = "codProdotto"; + public static final String COD_ABI = "codAbi"; + public static final String COD_CAB = "codCab"; + public static final String ID_NOTA = "idNota"; + public static final String IMPORTO_AGEVOLATO = "importoAgevolato"; + public static final String IMPORTO_MEDIOLUNGO_TERMINE = "importoMedioLungoTermine"; + public static final String COD_TIPO_PRODOTTO = "codTipoProdotto"; + public static final String COD_CATEGORIA_PRODOTTO = "codCategoriaProdotto"; + public static final String COD_FORMATECNICA = "codFormaTecnica"; + public static final String COD_OPERAZIONE = "codOperazione"; + public static final String MOTIVAZIONE_ID = "id"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index da225c54..cffda64e 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -332,7 +332,7 @@ public class GepafinConstant { public static final String DATA_STRING = "data"; public static final String DOCUMENT_ATTACHMENT_ID_STRING = "documentAttachmentId"; public static final String TEMP_FILE_PATH = "/tmp/"; - public static final String RICHIESTA_CLIENTE_STRING = "richiestaCliente"; + public static final String RICHIESTE_CLIENTE_STRING = "richiesteCliente"; public static final String ID_STRING = "id"; public static final String NULL_STRING = "null"; public static final String NDG_STRING = "ndg"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index a45b142d..8bf0b4a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.GetObjectRequest; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import feign.FeignException; @@ -16,18 +17,14 @@ import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.HubEntity; -import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AppointmentCreationRequest; import net.gepafin.tendermanagement.model.request.AppointmentNdgRequest; import net.gepafin.tendermanagement.model.request.AppointmentVisuraListRequest; import net.gepafin.tendermanagement.model.request.AppointmentVisuraRequest; import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; -import net.gepafin.tendermanagement.model.request.NotificationReq; import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; @@ -63,7 +60,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -388,7 +384,6 @@ public class AppointmentDao { // Validate and save token if (parsedResponse.getTokenId() != null) { hub.setAppointmentAuthTokenId(parsedResponse.getTokenId()); - hub.setAreaCode(parsedResponse.getAreaCode()); hubRepository.save(hub); // /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for @@ -406,10 +401,15 @@ public class AppointmentDao { } // Handle non-OK response throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); + } catch (FeignException.Forbidden forbiddenException) { + logForbiddenError(); + // Regenerate the token and retry + regenerateTokenAndSave(hub); } catch (Exception e) { log.error("Failed to authenticate user on Odessa : {}", e.getMessage(), e); throw new RuntimeException("Authentication failed on Odessa. try again", e); } + return null; } private AppointmentLoginResponse retrieveNdgByVatNumber(String vatNumber, String authorizationToken, HubEntity hub, ApplicationEntity application) { @@ -626,7 +626,8 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken); + int areaCode = Integer.parseInt(hub.getAreaCode()); + ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, areaCode); if (response.getStatusCode() != HttpStatus.OK) { log.error("Failed to retrieve appointment template for appointment creation. Status: {}", response.getStatusCode()); @@ -682,33 +683,61 @@ public class AppointmentDao { } public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { - try { ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); - JsonNode richiestaClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTA_CLIENTE_STRING); + JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); + // Initialize the result object AppointmentCreationRequest appointmentCreationRequest = new AppointmentCreationRequest(); AppointmentCreationRequest.Input input = new AppointmentCreationRequest.Input(); - - // Map `richiestaCliente` array List richiestaClienteList = new ArrayList<>(); - if (richiestaClienteArray.isArray()) { - for (JsonNode richiestaNode : richiestaClienteArray) { - richiestaClienteList.add(objectMapper.treeToValue(richiestaNode, AppointmentCreationRequest.RichiestaCliente.class)); - } + if (!richiesteClienteArray.isArray()) { + log.warn("richiesteCliente array is missing or not an array."); + return new AppointmentCreationRequest(); // Return empty object if array is missing + } + + for (JsonNode richiestaNode : richiesteClienteArray) { + if (richiestaNode.isNull()) continue; + + AppointmentCreationRequest.RichiestaCliente richiestaCliente = new AppointmentCreationRequest.RichiestaCliente(); + richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); + richiestaCliente.setCodProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_PRODOTTO)); + richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); + richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); + richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); + richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); + richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); + richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); + richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); + richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); + richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + + richiestaClienteList.add(richiestaCliente); } input.setRichiestaCliente(richiestaClienteList); appointmentCreationRequest.setInput(input); + return appointmentCreationRequest; + } catch (JsonProcessingException e) { + log.error("JSON processing error: {}", e.getMessage(), e); + throw new IllegalStateException("Invalid JSON structure in template response", e); } catch (Exception e) { - log.error("Error parsing template response: {}", e.getMessage(), e); + log.error("Unexpected error while parsing template response: {}", e.getMessage(), e); throw new IllegalStateException("Failed to parse template response", e); } } + private String getTextValue(JsonNode node, String fieldName) { + return node.path(fieldName).isTextual() ? node.path(fieldName).asText() : null; + } + + private int getIntValue(JsonNode node) { + return node.path(AppointmentApiConstant.MOTIVAZIONE).path(AppointmentApiConstant.MOTIVAZIONE_ID).asInt(); + } + public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, String areaCode, AppointmentCreationRequest templateRichiestaData) { @@ -733,7 +762,8 @@ public class AppointmentDao { requestNota.setTitolo(nota.getTitolo()); requestNota.setTesto(nota.getTesto()); richiestaCliente.setNota(requestNota); - + richiestaCliente.setDurataMesiFinanziamento(createAppointmentRequest.getDurataMesiFinanziamento()); + richiestaCliente.setImportoBreveTermine(createAppointmentRequest.getImportoBreveTermine()); richiestaClienteList.add(richiestaCliente); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java index a877a620..0bd6b812 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java @@ -20,8 +20,8 @@ public class AppointmentCreationRequest { public static class RichiestaCliente { private String codAbi; private String codCab; - private Integer durataMesiFinanziamento; - private Integer idMotivazione; + private int durataMesiFinanziamento; + private int idMotivazione; private String idNota; private String importoAgevolato; private Double importoBreveTermine; diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java index b193713b..1c3a44f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @@ -31,7 +32,7 @@ public interface AppointmentApiService { ResponseEntity getVisuraList(@RequestBody String visuraRequest, @RequestHeader("Authorization") String token); @GetMapping(value = AppointmentApiConstant.GET_APPOINTMENT_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token); + ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token, @RequestParam("idAppuntamentoTemplate") int templateId); @PostMapping(value = AppointmentApiConstant.CREATE_APPOINTMENT_FROM_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity createAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, String appointmentCreationRequest); From 245f9059e3cd8c8c014a120214e7a51482e1a57b Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 12 Feb 2025 11:48:06 +0530 Subject: [PATCH 03/50] Updated code for appointment creation and added a column in hub for appointment template id.. --- .../constants/AppointmentApiConstant.java | 4 +- .../constants/GepafinConstant.java | 3 + .../tendermanagement/dao/AppointmentDao.java | 64 ++++++++++++------- .../tendermanagement/entities/HubEntity.java | 3 + .../request/AppointmentCreationRequest.java | 2 +- .../feignClient/AppointmentApiService.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 8 +++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 9 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java index c82687a5..6e5ed97c 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java @@ -26,7 +26,7 @@ public class AppointmentApiConstant { //Appointment creation request body fields public static final String MOTIVAZIONE = "motivazione"; - public static final String COD_PRODOTTO = "codProdotto"; + public static final String PRODOTTO = "prodotto"; public static final String COD_ABI = "codAbi"; public static final String COD_CAB = "codCab"; public static final String ID_NOTA = "idNota"; @@ -37,5 +37,5 @@ public class AppointmentApiConstant { public static final String COD_FORMATECNICA = "codFormaTecnica"; public static final String COD_OPERAZIONE = "codOperazione"; public static final String MOTIVAZIONE_ID = "id"; - + public static final String PRODOTTO_CODE = "code"; } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5eb5128b..0b29c773 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -423,6 +423,9 @@ public class GepafinConstant { 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 APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; + public static final String APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE = "appointment.cannot.be.created.by.template"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 8bf0b4a4..f6fbd088 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -384,6 +384,7 @@ public class AppointmentDao { // Validate and save token if (parsedResponse.getTokenId() != null) { hub.setAppointmentAuthTokenId(parsedResponse.getTokenId()); + hub.setAreaCode(parsedResponse.getAreaCode()); hubRepository.save(hub); // /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for @@ -626,8 +627,8 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - int areaCode = Integer.parseInt(hub.getAreaCode()); - ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, areaCode); + Long appointmentTemplateId = hub.getAppointmentTemplateId(); + ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, appointmentTemplateId); if (response.getStatusCode() != HttpStatus.OK) { log.error("Failed to retrieve appointment template for appointment creation. Status: {}", response.getStatusCode()); @@ -636,10 +637,10 @@ public class AppointmentDao { // Parse template data String responseDataForTemplate = Utils.convertObjectToJson(response.getBody()); - AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate); + AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate, application.getCall().getProductId()); // Build the appointment request body - AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAreaCode(), + AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAppointmentTemplateId(), templateRichiestaData); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); @@ -682,8 +683,12 @@ public class AppointmentDao { return null; } - public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { + public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse, Long productId) { + try { + if (productId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); + } ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); @@ -694,26 +699,38 @@ public class AppointmentDao { List richiestaClienteList = new ArrayList<>(); if (!richiesteClienteArray.isArray()) { log.warn("richiesteCliente array is missing or not an array."); - return new AppointmentCreationRequest(); // Return empty object if array is missing + return new AppointmentCreationRequest(); } - + boolean isMatchedAtLeastOneId = false; for (JsonNode richiestaNode : richiesteClienteArray) { - if (richiestaNode.isNull()) continue; + if (richiestaNode.isNull()) + continue; AppointmentCreationRequest.RichiestaCliente richiestaCliente = new AppointmentCreationRequest.RichiestaCliente(); - richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); - richiestaCliente.setCodProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_PRODOTTO)); - richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); - richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); - richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); - richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); - richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); - richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); - richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); - richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); - richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + JsonNode prodottoNode = richiestaNode.path(AppointmentApiConstant.PRODOTTO); + String prodottoCode = prodottoNode.path(AppointmentApiConstant.PRODOTTO_CODE).asText(); - richiestaClienteList.add(richiestaCliente); + if (productId.toString().equals(prodottoCode)) { + isMatchedAtLeastOneId = true; + richiestaCliente.setCodProdotto(prodottoCode); + richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); + richiestaCliente.setCodProdotto(productId.toString()); + richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); + richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); + richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); + richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); + richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); + richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); + richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); + richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); + richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + + richiestaClienteList.add(richiestaCliente); + } + } + + if (!isMatchedAtLeastOneId) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE)); } input.setRichiestaCliente(richiestaClienteList); @@ -724,21 +741,20 @@ public class AppointmentDao { } catch (JsonProcessingException e) { log.error("JSON processing error: {}", e.getMessage(), e); throw new IllegalStateException("Invalid JSON structure in template response", e); - } catch (Exception e) { - log.error("Unexpected error while parsing template response: {}", e.getMessage(), e); - throw new IllegalStateException("Failed to parse template response", e); } } private String getTextValue(JsonNode node, String fieldName) { + return node.path(fieldName).isTextual() ? node.path(fieldName).asText() : null; } private int getIntValue(JsonNode node) { + return node.path(AppointmentApiConstant.MOTIVAZIONE).path(AppointmentApiConstant.MOTIVAZIONE_ID).asInt(); } - public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, String areaCode, + public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, Long areaCode, AppointmentCreationRequest templateRichiestaData) { ApplicationEntity application = applicationService.validateApplication(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index ccd6c325..ff6db1a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -64,6 +64,9 @@ public class HubEntity extends BaseEntity{ @Column(name = "AREA_CODE") private String areaCode; + @Column(name = "APPOINTMENT_TEMPLATE_ID") + private Long appointmentTemplateId; + @Column(name = "EVALUATION_EXPIRATION_DAYS") private Long evaluationExpirationDays; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java index 0bd6b812..a1c0bb12 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java @@ -11,7 +11,7 @@ public class AppointmentCreationRequest { @Data public static class Input { - private String id; + private Long id; private String ndg; private List richiestaCliente; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java index 1c3a44f7..036a2904 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java @@ -32,7 +32,7 @@ public interface AppointmentApiService { ResponseEntity getVisuraList(@RequestBody String visuraRequest, @RequestHeader("Authorization") String token); @GetMapping(value = AppointmentApiConstant.GET_APPOINTMENT_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token, @RequestParam("idAppuntamentoTemplate") int templateId); + ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token, @RequestParam("idAppuntamentoTemplate") Long templateId); @PostMapping(value = AppointmentApiConstant.CREATE_APPOINTMENT_FROM_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity createAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, String appointmentCreationRequest); 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 37c34586..6acccf72 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 @@ -2418,4 +2418,12 @@ + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7aab6f08..87163fb4 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -371,4 +371,6 @@ validation.required.requested.amount=The Requested Amount configuration should b company.id.not.null=Company ID cannot be null. formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. +appointment.cannot.be.created = Appointment cannot be created because call doesn't have the productId. +appointment.cannot.be.created.by.template = Product ID does not match with appointment template. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c1794a8d..66da42e2 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -362,4 +362,6 @@ validation.required.requested.amount=La configurazione dell'importo richiesto company.id.not.null=L'ID dell'azienda non pu? essere nullo. formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. +appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID prodotto. +appointment.cannot.be.created.by.template = L'ID prodotto non corrisponde al modello di appuntamento. From 7f388ea8ffa99f64d874ac4c8c179c6b379da48f Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 12 Feb 2025 18:37:42 +0530 Subject: [PATCH 04/50] Updated code --- .../constants/GepafinConstant.java | 7 + .../dao/ApplicationAmendmentRequestDao.java | 120 +++++++++++++ .../tendermanagement/dao/UserActionDao.java | 161 ++++++++++++++++-- .../gepafin/tendermanagement/dao/UserDao.java | 155 +++++++++++++++++ .../enums/UserActionContextEnum.java | 6 +- ...icationAmendmentPaginationRequestBean.java | 14 ++ .../request/UserActionPaginationRequest.java | 21 +++ .../request/UserPaginationRequestBean.java | 17 ++ .../response/SummaryPageResponseBean.java | 2 +- .../repositories/UserRepository.java | 3 +- .../ApplicationAmendmentRequestService.java | 3 + .../service/UserActionService.java | 4 + .../tendermanagement/service/UserService.java | 2 + ...pplicationAmendmentRequestServiceImpl.java | 8 + .../service/impl/UserActionServiceImpl.java | 7 + .../service/impl/UserServiceImpl.java | 7 + .../api/ApplicationAmendmentRequestApi.java | 19 ++- .../web/rest/api/UserActionApi.java | 19 ++- .../web/rest/api/UserApi.java | 20 ++- ...ApplicationAmendmentRequestController.java | 17 +- .../impl/AssignedApplicationsController.java | 7 +- .../api/impl/UserActionApiController.java | 12 ++ .../web/rest/api/impl/UserApiController.java | 14 +- 23 files changed, 614 insertions(+), 31 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentPaginationRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UserActionPaginationRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UserPaginationRequestBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index f7f796b5..578924cb 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -390,5 +390,12 @@ public class GepafinConstant { public static final String PROTOCOL="protocol"; public static final String PROTOCOL_NUMBER="protocolNumber"; public static final String NOTE="note"; + public static final String INTERNAL_NOTE="internalNote"; + public static final String ACTION_TYPE="actionType"; + public static final String ACTION_CONTEXT="actionContext"; + public static final String METHOD_TYPE="methodType"; + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 2cf5d3ca..280bea4e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -2,8 +2,10 @@ package net.gepafin.tendermanagement.dao; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -12,6 +14,7 @@ import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEm 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; @@ -25,6 +28,8 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; 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; @@ -37,6 +42,7 @@ import java.util.stream.Collectors; import static java.time.temporal.ChronoUnit.DAYS; import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isEmpty; @Component public class ApplicationAmendmentRequestDao { @@ -1183,4 +1189,118 @@ public class ApplicationAmendmentRequestDao { documentService.deleteFile(documentId); } + public PageableResponseBean> getApplicationAmendmentByPaginnation(Long userId, ApplicationAmendmentPaginationRequestBean applicationAmendmentPaginationRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (applicationAmendmentPaginationRequestBean.getGlobalFilters() != null) { + pageNo = applicationAmendmentPaginationRequestBean.getGlobalFilters().getPage(); + pageLimit = applicationAmendmentPaginationRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = searchPagination(userId,applicationAmendmentPaginationRequestBean); + Page entityPage = applicationAmendmentRequestRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + + + List applicationResponses = entityPage.getContent().stream() + .map(application -> { + ApplicationAmendmentRequestResponse response = convertEntityToResponse(application,false); + 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 searchPagination(Long userId,ApplicationAmendmentPaginationRequestBean applicationAmendmentPaginationRequestBean) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(applicationAmendmentPaginationRequestBean, criteriaBuilder, root,userId); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (applicationAmendmentPaginationRequestBean .getGlobalFilters() != null + && applicationAmendmentPaginationRequestBean.getGlobalFilters().getSortBy() != null && + applicationAmendmentPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(applicationAmendmentPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(applicationAmendmentPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (applicationAmendmentPaginationRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(applicationAmendmentPaginationRequestBean.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(ApplicationAmendmentPaginationRequestBean amendmentPaginationRequestBean, + CriteriaBuilder criteriaBuilder, Root root,Long userId) { + + Integer year = null; + String search = null; + if (amendmentPaginationRequestBean.getGlobalFilters() != null) { + year = amendmentPaginationRequestBean.getGlobalFilters().getYear(); + search = amendmentPaginationRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + if (year != null && year > 0) { + int filterYear = amendmentPaginationRequestBean.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 notePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.NOTE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(notePredicate)); + Predicate internalNotePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.INTERNAL_NOTE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(internalNotePredicate)); + } + + // Filter by `status` (if status list is provided) + if (amendmentPaginationRequestBean.getStatus() != null && !amendmentPaginationRequestBean.getStatus().isEmpty()) { + List statusValues = amendmentPaginationRequestBean.getStatus().stream() + .map(ApplicationAmendmentRequestEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + if(Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + predicates.add(root.get("applicationEvaluationEntity").get("assignedApplicationsEntity").get("application").get("userId").in(userId)); + } + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + predicates.add(root.get("applicationEvaluationEntity").get("assignedApplicationsEntity").get("userId").in(userId)); + } + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java index 7cf5472f..a4f0730d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java @@ -2,15 +2,18 @@ package net.gepafin.tendermanagement.dao; 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.RoleActionContextEntity; -import net.gepafin.tendermanagement.entities.UserActionEntity; -import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; 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.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; +import net.gepafin.tendermanagement.model.request.UserActionPaginationRequest; +import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.repositories.RoleActionContextRepository; import net.gepafin.tendermanagement.repositories.UserActionsRepository; @@ -23,9 +26,12 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import static org.apache.commons.lang3.StringUtils.isEmpty; + @Component public class UserActionDao { @@ -47,10 +53,11 @@ public class UserActionDao { List userActions = getFilterUserActions(userEntity.getId(),timeFilter,actionContext); - return createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,userActions); + return null; +// createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,userActions); } - public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed, List userActions){ + public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed,PageableResponseBean> userActions){ SummaryPageResponseBean response = new SummaryPageResponseBean(); response.setRole(user.getRoleEntity().getRoleName()); response.setLastLogin(user.getLastLogin()); @@ -59,9 +66,7 @@ public class UserActionDao { response.setEmail(user.getEmail()); response.setNumberOfLoginAttempts(numberOfLoginAttempts); response.setApplicationsProcessed(applicationsProcessed); - - List userAction = convertEntityToResponse(userActions); - response.setUserActions(userAction); + response.setUserActions(userActions); return response; } @@ -157,4 +162,138 @@ public class UserActionDao { return responseBean; }).collect(Collectors.toList()); } + public SummaryPageResponseBean getUserActionByPagination(UserEntity user, UserActionPaginationRequest userActionPaginationRequest) { + Integer pageNo = null; + Integer pageLimit = null; + if (userActionPaginationRequest.getGlobalFilters() != null) { + pageNo = userActionPaginationRequest.getGlobalFilters().getPage(); + pageLimit = userActionPaginationRequest.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(userActionPaginationRequest,user); + Page entityPage = userActionsRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + Long numberOfLoginAttempts = userActionsRepository.countUserLoginAttempts(user.getId()); + Long applicationsProcessed = assignedApplicationsRepository.countAssignedApplicationsByUserId(user.getId()); + + + List userActionResponseBeans = convertEntityToResponse(entityPage.stream().toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(userActionResponseBeans); + 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 createSummaryPageResponse(user,numberOfLoginAttempts,applicationsProcessed,pageableResponseBean); + } + public Specification search(UserActionPaginationRequest userActionPaginationRequest,UserEntity userEntity) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(userActionPaginationRequest, criteriaBuilder, root,userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (userActionPaginationRequest .getGlobalFilters() != null + && userActionPaginationRequest.getGlobalFilters().getSortBy() != null && + userActionPaginationRequest.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(userActionPaginationRequest.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(userActionPaginationRequest.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (userActionPaginationRequest.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(userActionPaginationRequest.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(UserActionPaginationRequest userActionPaginationRequest, + CriteriaBuilder criteriaBuilder, Root root,UserEntity userEntity) { + + Integer year = null; + String search = null; + if (userActionPaginationRequest.getGlobalFilters() != null) { + year = userActionPaginationRequest.getGlobalFilters().getYear(); + search = userActionPaginationRequest.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + if (year != null && year > 0) { + int filterYear = userActionPaginationRequest.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 actionType = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.ACTION_TYPE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(actionType)); + Predicate actionContext = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.ACTION_CONTEXT)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(actionContext)); + Predicate methodType = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.METHOD_TYPE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(methodType)); + } + + // Filter by `status` (if status list is provided) + if (userActionPaginationRequest.getActionContext() != null && !userActionPaginationRequest.getActionContext().isEmpty()) { + List statusValues = userActionPaginationRequest.getActionContext().stream() + .map(UserActionContextEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get("actionContext").in(statusValues)); + } + if (userActionPaginationRequest.getActionType() != null && !userActionPaginationRequest.getActionType().isEmpty()) { + List statusValues = userActionPaginationRequest.getActionType().stream() + .map(UserActionLogsEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get("actionType").in(statusValues)); + } + + TimePeriodEnum timeRange= userActionPaginationRequest.getTimeFilter(); + if (timeRange != null) { + LocalDateTime startDate = null; + LocalDateTime endDate = LocalDateTime.now(); + + switch (timeRange) { + case LAST_WEEK -> startDate = endDate.minusWeeks(1); + case LAST_QUARTER -> startDate = endDate.minusMonths(3); + case LAST_SEMESTER -> startDate = endDate.minusMonths(6); + case LAST_YEAR -> startDate = endDate.minusYears(1); + } + + if (startDate != null) { + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startDate, endDate)); + } + } + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 0ffa0b42..7de86017 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -1,5 +1,8 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.SamlSuccessHandler; @@ -10,6 +13,7 @@ import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.JWTToken; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.BeneficiaryRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.HubService; @@ -28,8 +32,13 @@ 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.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -37,6 +46,7 @@ import java.util.Map; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isEmpty; @Component public class UserDao { @@ -596,6 +606,151 @@ public class UserDao { log.info("Total users found with role ID {}: {}", roleIds, userResponseBeans.size()); return userResponseBeans; } + public PageableResponseBean> getUserByPagination(UserPaginationRequestBean userPaginationRequestBean,UserEntity userEntity) { + Integer pageNo = null; + Integer pageLimit = null; + if (userPaginationRequestBean.getGlobalFilters() != null) { + pageNo = userPaginationRequestBean.getGlobalFilters().getPage(); + pageLimit = userPaginationRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(userPaginationRequestBean,userEntity); + Page entityPage = userRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + List applicationResponses = entityPage.getContent().stream() + .map(user -> { + UserResponseBean response = convertUserEntityToUserResponse(user); + 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(UserPaginationRequestBean userPaginationRequestBean,UserEntity userEntity) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(userPaginationRequestBean, criteriaBuilder, root,userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (userPaginationRequestBean .getGlobalFilters() != null + && userPaginationRequestBean.getGlobalFilters().getSortBy() != null && + userPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(userPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(userPaginationRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (userPaginationRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(userPaginationRequestBean.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(UserPaginationRequestBean userPaginationRequestBean, + CriteriaBuilder criteriaBuilder, Root root,UserEntity user) { + + Integer year = null; + String search = null; + if (userPaginationRequestBean.getGlobalFilters() != null) { + year = userPaginationRequestBean.getGlobalFilters().getYear(); + search = userPaginationRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + if (year != null && year > 0) { + int filterYear = userPaginationRequestBean.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 predicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get("firstName")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate)); + Predicate predicate1 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("lastName")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate1)); + + Predicate predicate2 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("phoneNumber")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate2)); + + Predicate predicate3 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("organization")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate3)); + + Predicate predicate4 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("address")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate4)); + + Predicate predicate5 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("city")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate5)); + + Predicate predicate6 = criteriaBuilder.like( + criteriaBuilder.upper(root.get("country")), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(predicate6)); + + + } + + // Filter by `status` (if status list is provided) + if (userPaginationRequestBean.getStatus() != null && !userPaginationRequestBean.getStatus().isEmpty()) { + List statusValues = userPaginationRequestBean.getStatus().stream() + .map(UserStatusEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + if (userPaginationRequestBean.getRole() != null && !userPaginationRequestBean.getRole().isEmpty()) { + List roleValues = userPaginationRequestBean.getRole().stream() + .map(RoleStatusEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get("roleEntity").get("roleType").in(roleValues)); + } + predicates.add(root.get(GepafinConstant.HUB).get("id").in(user.getHub().getId())); + + 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 5cae2da0..83a8c8c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -172,7 +172,11 @@ public enum UserActionContextEnum { GET_USER_ACTION("GET_USER_ACTION"), - GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"); + GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"), + GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION("GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION"), + GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), + GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), + GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentPaginationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentPaginationRequestBean.java new file mode 100644 index 00000000..42318247 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentPaginationRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; + +import java.util.List; + +@Data +public class ApplicationAmendmentPaginationRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserActionPaginationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserActionPaginationRequest.java new file mode 100644 index 00000000..986cb979 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserActionPaginationRequest.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.TimePeriodEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; + +import java.util.List; + +@Data +public class UserActionPaginationRequest { + + private GlobalFilters globalFilters; + + private TimePeriodEnum timeFilter; + + private List actionContext; + + private List actionType; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserPaginationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserPaginationRequestBean.java new file mode 100644 index 00000000..89037dc4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserPaginationRequestBean.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; + +import java.util.List; + +@Data +public class UserPaginationRequestBean { + + private GlobalFilters globalFilters; + + private List status; + + private List role; +} 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 a15a6510..9c1c7585 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java @@ -14,5 +14,5 @@ public class SummaryPageResponseBean { private LocalDateTime registrationDate; private Long numberOfLoginAttempts; private Long applicationsProcessed; - private List userActions; + private PageableResponseBean> userActions; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index ab00d3e0..9f58ea49 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserEntity; 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; @@ -10,7 +11,7 @@ import java.util.List; import java.util.Optional; @Repository -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository, JpaSpecificationExecutor { UserEntity findByBeneficiaryId(Long beneficiaryId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 678ff913..f3371296 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -4,10 +4,12 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentPaginationRequestBean; 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.PageableResponseBean; import java.util.List; @@ -26,4 +28,5 @@ public interface ApplicationAmendmentRequestService { public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status); void sendReminderEmail(HttpServletRequest request,Long amendmentId); + PageableResponseBean> getApplicationAmendmentByPaginnation(HttpServletRequest request, Long userId, ApplicationAmendmentPaginationRequestBean amendmentPaginationRequestBean); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java index e12bae6a..30eed741 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java @@ -3,6 +3,7 @@ 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.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; @@ -12,4 +13,7 @@ public interface UserActionService { public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext); public List getActionContextLabels(HttpServletRequest request, Long userId); + + public SummaryPageResponseBean getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 6a92a667..43e257d6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -47,4 +48,5 @@ public interface UserService { public UserEntity getUserEntityById(Long userId); List getAllUsers(HttpServletRequest request, List roleIds); + PageableResponseBean> getUserByPagination(HttpServletRequest request, UserPaginationRequestBean userPaginationRequestBean); } 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..212a3041 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -8,10 +8,12 @@ import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentPaginationRequestBean; 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.PageableResponseBean; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; @@ -149,4 +151,10 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm applicationAmendmentRequestDao.sendReminderEmail(amendmentId); } } + + @Override + public PageableResponseBean> getApplicationAmendmentByPaginnation(HttpServletRequest request, Long userId, ApplicationAmendmentPaginationRequestBean amendmentPaginationRequestBean) { + UserEntity user=validator.validateUser(request); + return applicationAmendmentRequestDao.getApplicationAmendmentByPaginnation(userId,amendmentPaginationRequestBean); + } } 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 65d692dc..192ebce8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java @@ -5,6 +5,7 @@ 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.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.service.UserActionService; @@ -35,4 +36,10 @@ public class UserActionServiceImpl implements UserActionService { UserEntity user = validator.validateUserId(request, userId); return userActionDao.getActionContextLabels(request,user); } + + @Override + public SummaryPageResponseBean getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { + UserEntity user = validator.validateUserId(request, userId); + return userActionDao.getUserActionByPagination(user,userActionPaginationRequest); + } } 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..f8d6aaf6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -11,6 +11,7 @@ import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -130,4 +131,10 @@ public class UserServiceImpl implements UserService { UserEntity user=validator.validateUser(request); return userDao.getAllUsers(user, roleIds); } + + @Override + public PageableResponseBean> getUserByPagination(HttpServletRequest request, UserPaginationRequestBean userPaginationRequestBean) { + UserEntity user=validator.validateUser(request); + return userDao.getUserByPagination(userPaginationRequestBean,user); + } } \ No newline at end of file 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..ef921c3a 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 @@ -9,11 +9,11 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -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.request.*; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +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; @@ -188,4 +188,17 @@ public interface ApplicationAmendmentRequestApi { @Parameter( required = true) @PathVariable(value = "amendmentId") Long amendmentId); + @Operation(summary = "Api to get all application amendment 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", produces = { "application/json" }) + ResponseEntity>>> getApplicationAmendmentByPaginnation(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @RequestBody ApplicationAmendmentPaginationRequestBean userActionPaginationRequest); + } 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 95d0f125..5cf39464 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 @@ -8,15 +8,14 @@ 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.request.UserActionPaginationRequest; 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; 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; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -46,4 +45,18 @@ public interface UserActionApi { @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); + + @Operation(summary = "Api to get all user action 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", produces = { "application/json" }) + ResponseEntity> getUserActionByPaginnation(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @RequestBody UserActionPaginationRequest userActionPaginationRequest); + } 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..2a3afdef 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 @@ -10,6 +10,8 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -243,9 +245,21 @@ public interface UserApi { @RequestMapping("favicon.ico") @ResponseBody void returnNoFavicon(); - - - + + @Operation(summary = "Api to get all user 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", produces = { "application/json" }) + ResponseEntity>>> getUserByPagination(HttpServletRequest request, + @RequestBody UserPaginationRequestBean userPaginationRequestBean); + + } 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..47f87706 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 @@ -7,11 +7,9 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; -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.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -187,4 +185,15 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_SENT_SUCCESS_MSG))); } + @Override + public ResponseEntity>>> getApplicationAmendmentByPaginnation(HttpServletRequest request, Long userId, ApplicationAmendmentPaginationRequestBean amendmentPaginationRequestBean) { + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION).build()); + + PageableResponseBean> listPageableResponseBean=applicationAmendmentRequestService.getApplicationAmendmentByPaginnation(request,userId,amendmentPaginationRequestBean); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(listPageableResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); + + } + } 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 18c30490..c7243199 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 @@ -94,10 +94,11 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Override public ResponseEntity>>> getAllAssignedApplicationsByPagination(HttpServletRequest request, Long userId, AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean) { - loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_NOTIFICATION_BY_PAGINATION).build()); + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION).build()); - PageableResponseBean> notificationResponses=assignedApplicationsService.getAllAssignedApplicationsByPagination(request, userId,assignedApplicationPageableRequestBean); - return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); + PageableResponseBean> assigenedApplicationResponses=assignedApplicationsService.getAllAssignedApplicationsByPagination(request, userId,assignedApplicationPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(assigenedApplicationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } 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 c65fbe2f..95c05f5c 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 @@ -6,6 +6,7 @@ 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.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; @@ -54,5 +55,16 @@ public class UserActionApiController implements UserActionApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(actionContextResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.ACTION_CONTEXT_LABELS_FETCHED_SUCCESSFULLY))); } + + @Override + public ResponseEntity> getUserActionByPaginnation(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_USER_ACTION_BY_PAGINATION).build()); + + SummaryPageResponseBean userActionResponse= userActionService.getUserActionByPagination(request,userId,userActionPaginationRequest); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(userActionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_ACTION_FETCHED_SUCCESSFULLY))); + + } } 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..7f36aac1 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 @@ -11,6 +11,7 @@ import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; @@ -247,5 +248,16 @@ public class UserApiController implements UserApi { public void returnNoFavicon() { // Do nothing } - + + @Override + public ResponseEntity>>> getUserByPagination(HttpServletRequest request, UserPaginationRequestBean userPaginationRequestBean) { + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_USER_BY_PAGINATION).build()); + + PageableResponseBean> users = userService.getUserByPagination(request,userPaginationRequestBean); + + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(users, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USERS_SUCCESS_MSG))); + + } + } \ No newline at end of file From 3fb9cfa0f55f79bc5618b0c34ce1fbb7d75a7bf2 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 15:48:24 +0530 Subject: [PATCH 05/50] updated code --- .../java/net/gepafin/tendermanagement/dao/UserActionDao.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java index a4f0730d..61c2e153 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java @@ -142,6 +142,7 @@ public class UserActionDao { responseBean.setResponse(action.getResponse()); responseBean.setCreatedDate(action.getCreatedDate()); responseBean.setUpdatedDate(action.getUpdatedDate()); + responseBean.setMethodType(action.getMethodType()); return responseBean; }).collect(Collectors.toList()); } From 32617b0291fd7bf485348023d8f665a8e9f6fcc7 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 17:57:48 +0530 Subject: [PATCH 06/50] Fixed validation issue for table --- .../tendermanagement/util/FieldValidator.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index d311547a..7a4e24b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -224,32 +224,32 @@ public class FieldValidator { 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; - } - - } +// 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) { } From 73b738e6f9bd330d399fd501f13ba62a0a1a5b01 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 19:23:27 +0530 Subject: [PATCH 07/50] Updated response for email template in amendment --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 0e138227..ab5a159b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1083,7 +1083,7 @@ public class ApplicationAmendmentRequestDao { List response = new ArrayList<>(); if (applicationAmendmentRequestEntity != null) { response = applicationAmendmentRequestEntity.stream() - .map(entity -> convertEntityToResponse(entity, false)) + .map(entity -> convertEntityToResponse(entity, true)) .collect(Collectors.toList()); } return response; From 268f7dc387e6e532a7c3288a29989909fe2b86ea Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 13 Feb 2025 19:32:14 +0530 Subject: [PATCH 08/50] Updated code for email in application submission --- .../tendermanagement/dao/ApplicationDao.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 9c65b574..18e522dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1132,22 +1132,28 @@ 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(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); - } - List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) - .map(String::trim) - .filter(email -> !email.isEmpty()) - .toList(); +// 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); +// } +// 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); +// } + + List hubEmails = Arrays.stream(hub.getEmail().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); + emailNotificationDao.sendMail(hub.getId(), subject, body,hubEmails,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } From 555a5d777a80d4ea211f50816f69bffb3875bb38 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 14 Feb 2025 10:14:39 +0530 Subject: [PATCH 09/50] Fixed table validation issue --- .../tendermanagement/util/FieldValidator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 7a4e24b8..edde130a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -251,6 +251,22 @@ public class FieldValidator { // // } + + boolean hasAtLeastOneNonEmptyPredefinedFalse = fieldValueList.stream() + .anyMatch(field -> stateFieldMap.entrySet().stream() + .filter(entry -> Boolean.FALSE.equals(entry.getValue())) // Check only predefined: false fields + .anyMatch(entry -> { + Object fieldValue = field.get(entry.getKey()); + return fieldValue != null && !StringUtils.isEmpty(fieldValue.toString()); + }) + ); + + if (!hasAtLeastOneNonEmptyPredefinedFalse) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), + fieldId)); + } + } catch (Exception e) { } } From 0be7ec5a2c73e2b53136d02d42a7d25d5a5c906e Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 14 Feb 2025 12:37:13 +0530 Subject: [PATCH 10/50] Done ticket GEPAFINBE-165 --- .../tendermanagement/dao/CompanyDao.java | 41 ++++++++++++++++--- .../entities/CompanyEntity.java | 3 ++ .../entities/UserWithCompanyEntity.java | 3 -- .../db/changelog/db.changelog-1.0.0.xml | 12 ++++++ ...json_column_in_company_data_06_02_2025.sql | 18 ++++++++ 5 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 3a527d9f..1f0446a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -122,10 +122,40 @@ public class CompanyDao { userWithCompanyEntity.setPec(companyRequest.getPec()); userWithCompanyEntity.setContactName(companyRequest.getContactName()); userWithCompanyEntity.setContactEmail(companyRequest.getContactEmail()); - userWithCompanyEntity.setJson(Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) ); UserWithCompanyEntity userWithCompany = userWithCompanyRepository.save(userWithCompanyEntity); /** This code is responsible for adding a version history log for the "adding user with company" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(userWithCompany).build()); + if (StringUtils.isEmpty(companyEntity.getJson())) { + companyEntity.setJson(Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse())); + Map vatCheckResponse = companyRequest.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) { + companyEntity.setCodiceAteco(codiceAteco); + } + } + } + } + } + + companyEntity = companyRepository.save(companyEntity); + + /** This code is responsible for adding a version history log for "updating company json field" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder() + .request(request) + .actionType(VersionActionTypeEnum.INSERT) + .oldData(null) + .newData(companyEntity) + .build()); + } + return userWithCompany; } @@ -143,6 +173,7 @@ public class CompanyDao { entity.setNumberOfEmployees(request.getNumberOfEmployees()); entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setHub(userEntity.getHub()); + entity.setJson(Utils.convertMapIntoJsonString(request.getVatCheckResponse())); if (request.getVatCheckResponse() != null) { Map vatCheckResponse = request.getVatCheckResponse(); Map data = (Map) vatCheckResponse.get("data"); @@ -226,10 +257,10 @@ public class CompanyDao { UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyId); //cloned entity for old data UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(userWithCompanyEntity); - if(StringUtils.isNotBlank(companyRequest.getVatNumber())) { - String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; - setIfUpdated(userWithCompanyEntity::getJson, userWithCompanyEntity::setJson, responseJson); - } +// if(StringUtils.isNotBlank(companyRequest.getVatNumber())) { +// String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; +// setIfUpdated(companyEntity::getJson, companyEntity::setJson, responseJson); +// } setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, companyRequest.getPec()); setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, companyRequest.getEmail()); setIfUpdated(userWithCompanyEntity::getContactName, userWithCompanyEntity::setContactName, companyRequest.getContactName()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index 932a8758..12dc2a15 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -59,4 +59,7 @@ public class CompanyEntity extends BaseEntity{ @Column(name = "CODICE_ATECO") private String codiceAteco; + + @Column(name = "JSON") + private String json; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java index 1f067a90..65afbe76 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java @@ -35,9 +35,6 @@ public class UserWithCompanyEntity extends BaseEntity{ @Column(name = "EMAIL") private String email; - @Column(name = "JSON") - private String json; - @Column(name = "IS_DELETED") private Boolean isDeleted = false; 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..15b0f5bf 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,16 @@ + + + + + + + + + + + diff --git a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql new file mode 100644 index 00000000..42c00d43 --- /dev/null +++ b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql @@ -0,0 +1,18 @@ +UPDATE COMPANY C +SET JSON = ( + SELECT U.JSON + FROM USER_WITH_COMPANY U + WHERE U.COMPANY_ID = C.ID + AND U.IS_DELETED = false + AND U.JSON IS NOT NULL + AND U.JSON <> '' + ORDER BY U.ID ASC + LIMIT 1 +) +WHERE EXISTS ( + SELECT 1 FROM USER_WITH_COMPANY U + WHERE U.COMPANY_ID = C.ID + AND U.IS_DELETED = false + AND U.JSON IS NOT NULL + AND U.JSON <> '' +); From 3de5b3f0b2e5cb427fbaa5bca4b5aafb4942c687 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 14 Feb 2025 13:19:45 +0530 Subject: [PATCH 11/50] Removed stack trace code for few exceptions --- .../tendermanagement/util/UserActionAspect.java | 2 +- .../web/rest/api/errors/GlobalExceptionHandler.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java b/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java index 0064bb82..2262e4a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java +++ b/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java @@ -61,7 +61,7 @@ public class UserActionAspect { handleSuccessResponse((ResponseEntity) result, storedUserActionId == null ? userActionId : storedUserActionId); } } catch (Exception ex) { - log.error("Exception occurred: ", ex); +// log.error("Exception occurred: ", ex); handleError(ex, getUserActionIdFromRequest(request)); throw ex; } finally { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index cec3c224..8b431b54 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -36,7 +36,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleCustomValidationException(final CustomValidationException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, ex.getStatus(), ex.getMessage()); } @@ -45,14 +45,14 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleValidationException(final ValidationException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(ex.getErrors(), ex.getStatus(), ex.getMessage()); } @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new Response<>(null, ex.getStatus(), ex.getMessage())); } @@ -71,7 +71,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleInvalidTokenException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(ex.getMessage(), Status.UNAUTHORIZED, Translator.toLocale("invalid_signature")); } @@ -80,7 +80,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response unauthorizedAccessException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, Status.UNAUTHORIZED, ex.getMessage()); } @@ -115,7 +115,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleUnAuthorizedException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, Status.VALIDATION_ERROR, Translator.toLocale("invalid_login")); } From 4fb0a08330a9edadf135d9d30aa091d6457abbec Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 14 Feb 2025 13:57:39 +0530 Subject: [PATCH 12/50] Updated code for table validation --- .../net/gepafin/tendermanagement/util/FieldValidator.java | 4 +++- 1 file changed, 3 insertions(+), 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 edde130a..2cf40d4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -160,7 +160,7 @@ public class FieldValidator { public FieldValidator validateCustomTableValidation(String value, String customRule, String fieldId, ContentResponseBean contentResponseBean) { - if (customRule == null || value == null) { + if (customRule == null ) { return this; // No custom rule to validate } @@ -168,6 +168,7 @@ public class FieldValidator { case GepafinConstant.NON_EMPTY_TABLES: try { + checkTableValidation(value, fieldId, contentResponseBean, errors); } catch (Exception e) { throw new RuntimeException(e); @@ -186,6 +187,7 @@ public class FieldValidator { .findFirst() // Get the first matching result .orElse(null); // Default to null if no match + if (tableType!=null){ try { Object object = PdfUtils.extractRows(value);; From 48b6b148c04b9ff6a1a074ef7d58bac018738cbb Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 17 Feb 2025 12:50:21 +0530 Subject: [PATCH 13/50] Updated code --- .../gepafin/tendermanagement/web/rest/api/NotificationApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8cccb46c..2af8e846 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 @@ -120,7 +120,7 @@ public interface NotificationApi { @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}/company/{companyId}/notifications/pagination", produces = "application/json") + @PostMapping(value = "/user/{userId}/company/{companyId}/pagination", produces = "application/json") ResponseEntity>>> getNotificationsByUserIdAndCompanyIdByPagination(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable(value = "userId") Long userId, @Parameter(description = "The company ID", required = true) @PathVariable(value = "companyId") Long companyId, From 2304e1cc7241b015fe782a6c08dbcb29ff0706ac Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 17 Feb 2025 15:42:11 +0530 Subject: [PATCH 14/50] Updated code --- .../tendermanagement/dao/UserActionDao.java | 14 +++++--------- .../model/response/SummaryPageResponseBean.java | 1 - .../service/UserActionService.java | 6 ++++-- .../service/impl/UserActionServiceImpl.java | 8 +++++--- .../rest/api/ApplicationAmendmentRequestApi.java | 4 ++-- .../web/rest/api/UserActionApi.java | 12 ++++++------ .../tendermanagement/web/rest/api/UserApi.java | 2 +- .../web/rest/api/impl/UserActionApiController.java | 10 ++++++---- 8 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java index a4f0730d..c05cb03e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserActionDao.java @@ -47,17 +47,14 @@ public class UserActionDao { @Autowired private RoleActionContextRepository roleActionContextRepository; - public SummaryPageResponseBean getUserAction(HttpServletRequest request, UserEntity userEntity, TimePeriodEnum timeFilter, List actionContext){ + public SummaryPageResponseBean getUserAction(HttpServletRequest request, UserEntity userEntity){ Long numberOfLoginAttempts = userActionsRepository.countUserLoginAttempts(userEntity.getId()); Long applicationsProcessed = assignedApplicationsRepository.countAssignedApplicationsByUserId(userEntity.getId()); - List userActions = getFilterUserActions(userEntity.getId(),timeFilter,actionContext); - - return null; -// createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed,userActions); + return createSummaryPageResponse(userEntity,numberOfLoginAttempts,applicationsProcessed); } - public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed,PageableResponseBean> userActions){ + public SummaryPageResponseBean createSummaryPageResponse(UserEntity user, Long numberOfLoginAttempts, Long applicationsProcessed){ SummaryPageResponseBean response = new SummaryPageResponseBean(); response.setRole(user.getRoleEntity().getRoleName()); response.setLastLogin(user.getLastLogin()); @@ -66,7 +63,6 @@ public class UserActionDao { response.setEmail(user.getEmail()); response.setNumberOfLoginAttempts(numberOfLoginAttempts); response.setApplicationsProcessed(applicationsProcessed); - response.setUserActions(userActions); return response; } @@ -162,7 +158,7 @@ public class UserActionDao { return responseBean; }).collect(Collectors.toList()); } - public SummaryPageResponseBean getUserActionByPagination(UserEntity user, UserActionPaginationRequest userActionPaginationRequest) { + public PageableResponseBean> getUserActionByPagination(UserEntity user, UserActionPaginationRequest userActionPaginationRequest) { Integer pageNo = null; Integer pageLimit = null; if (userActionPaginationRequest.getGlobalFilters() != null) { @@ -192,7 +188,7 @@ public class UserActionDao { pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); pageableResponseBean.setPageSize(entityPage.getSize()); - return createSummaryPageResponse(user,numberOfLoginAttempts,applicationsProcessed,pageableResponseBean); + return pageableResponseBean; } public Specification search(UserActionPaginationRequest userActionPaginationRequest,UserEntity userEntity) { return (root, query, criteriaBuilder) -> { 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 9c1c7585..a5b9fc19 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SummaryPageResponseBean.java @@ -14,5 +14,4 @@ public class SummaryPageResponseBean { private LocalDateTime registrationDate; private Long numberOfLoginAttempts; private Long applicationsProcessed; - private PageableResponseBean> userActions; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java index 30eed741..e051c825 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserActionService.java @@ -5,15 +5,17 @@ import net.gepafin.tendermanagement.enums.TimePeriodEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.model.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.response.UserActionResponseBean; import java.util.List; public interface UserActionService { - public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext); + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId); public List getActionContextLabels(HttpServletRequest request, Long userId); - public SummaryPageResponseBean getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest); + public PageableResponseBean> getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest); } 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 192ebce8..7424c4ac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserActionServiceImpl.java @@ -7,7 +7,9 @@ import net.gepafin.tendermanagement.enums.TimePeriodEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.model.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.response.UserActionResponseBean; import net.gepafin.tendermanagement.service.UserActionService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; @@ -26,9 +28,9 @@ public class UserActionServiceImpl implements UserActionService { @Override - public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext) { + public SummaryPageResponseBean getUserAction(HttpServletRequest request, Long userId) { UserEntity user = validator.validateUserId(request, userId); - return userActionDao.getUserAction(request,user,timeFilter,actionContext); + return userActionDao.getUserAction(request,user); } @Override @@ -38,7 +40,7 @@ public class UserActionServiceImpl implements UserActionService { } @Override - public SummaryPageResponseBean getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { + public PageableResponseBean> getUserActionByPagination(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { UserEntity user = validator.validateUserId(request, userId); return userActionDao.getUserActionByPagination(user,userActionPaginationRequest); } 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 ef921c3a..7c813073 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 @@ -76,7 +76,7 @@ public interface ApplicationAmendmentRequestApi { @GetMapping(value = "", produces = "application/json") ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,@Parameter(description = "The application amendment id", required = true) @RequestParam(value = "id", required = true) Long id); - @Operation(summary = "Api to get all applications amendment request by preInstructor user Id", + @Operation(summary = "Api to get all applications amendment request by preInstructor user Id (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -104,7 +104,7 @@ public interface ApplicationAmendmentRequestApi { @Parameter(description = "The Application Amendment id", required = true) @PathVariable("id") Long id, @Parameter(description = "Assigned Application request object", required = true) @Valid @RequestBody ApplicationAmendmentRequestBean applicationAmendmentRequestBean); - @Operation(summary = "Api to get all applications amendment request by beneficary user Id", + @Operation(summary = "Api to get all applications amendment request by beneficary user Id (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { 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 5cf39464..6aed00a0 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 @@ -10,7 +10,9 @@ import net.gepafin.tendermanagement.enums.TimePeriodEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.model.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.response.UserActionResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; @@ -20,7 +22,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; public interface UserActionApi { - @Operation(summary = "Api to get user action", + @Operation(summary = "Api to get user summary ", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -30,9 +32,7 @@ public interface UserActionApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @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) List actionContext); + ResponseEntity> getUserAction(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId); @Operation(summary = "Api to get action context label", responses = { @@ -56,7 +56,7 @@ public interface UserActionApi { @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", produces = { "application/json" }) - ResponseEntity> getUserActionByPaginnation(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, - @RequestBody UserActionPaginationRequest userActionPaginationRequest); + ResponseEntity>>> getUserActionByPaginnation(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, + @RequestBody UserActionPaginationRequest userActionPaginationRequest); } 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 2a3afdef..d9321b20 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 @@ -227,7 +227,7 @@ public interface UserApi { ResponseEntity> validateNewUserToken(HttpServletRequest request, @Parameter(description = "The spid token", required = true) @PathVariable("token") String token); - @Operation(summary = "Api to get all users", + @Operation(summary = "Api to get all users (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { 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 95c05f5c..26dfd2b3 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 @@ -9,7 +9,9 @@ import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionPaginationRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.ActionContextLabelResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.response.SummaryPageResponseBean; +import net.gepafin.tendermanagement.model.response.UserActionResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.UserActionService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -34,12 +36,12 @@ public class UserActionApiController implements UserActionApi { private LoggingUtil loggingUtil; @Override - public ResponseEntity> getUserAction(HttpServletRequest request, Long userId, TimePeriodEnum timeFilter, List actionContext) { + public ResponseEntity> getUserAction(HttpServletRequest request, Long userId) { /** 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); + SummaryPageResponseBean userActionResponse= userActionService.getUserAction(request,userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(userActionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_ACTION_FETCHED_SUCCESSFULLY))); } @@ -57,11 +59,11 @@ public class UserActionApiController implements UserActionApi { } @Override - public ResponseEntity> getUserActionByPaginnation(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { + public ResponseEntity>>> getUserActionByPaginnation(HttpServletRequest request, Long userId, UserActionPaginationRequest userActionPaginationRequest) { loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_ALL_USER_ACTION_BY_PAGINATION).build()); - SummaryPageResponseBean userActionResponse= userActionService.getUserActionByPagination(request,userId,userActionPaginationRequest); + PageableResponseBean> userActionResponse= userActionService.getUserActionByPagination(request,userId,userActionPaginationRequest); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(userActionResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_ACTION_FETCHED_SUCCESSFULLY))); From 0eaf0961bd2992a753666183ad4672d691d55af9 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 17 Feb 2025 15:46:59 +0530 Subject: [PATCH 15/50] Updated company json script --- .../db/dump/insert_json_column_in_company_data_06_02_2025.sql | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql index 42c00d43..42fa12b7 100644 --- a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql +++ b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql @@ -3,7 +3,6 @@ SET JSON = ( SELECT U.JSON FROM USER_WITH_COMPANY U WHERE U.COMPANY_ID = C.ID - AND U.IS_DELETED = false AND U.JSON IS NOT NULL AND U.JSON <> '' ORDER BY U.ID ASC @@ -12,7 +11,6 @@ SET JSON = ( WHERE EXISTS ( SELECT 1 FROM USER_WITH_COMPANY U WHERE U.COMPANY_ID = C.ID - AND U.IS_DELETED = false AND U.JSON IS NOT NULL AND U.JSON <> '' ); From 5e360845a7ffc31622ee25d63577c811da3be80a Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 17 Feb 2025 16:17:07 +0530 Subject: [PATCH 16/50] Updated code for appointment creation flow and productId field to appointmentTemplateId. --- .../constants/GepafinConstant.java | 2 +- .../dao/ApplicationEvaluationDao.java | 5 +-- .../tendermanagement/dao/AppointmentDao.java | 43 ++++++++----------- .../dao/AssignedApplicationsDao.java | 4 +- .../gepafin/tendermanagement/dao/CallDao.java | 8 ++-- .../tendermanagement/entities/CallEntity.java | 4 +- .../tendermanagement/entities/HubEntity.java | 3 -- .../model/request/CreateCallRequestStep1.java | 2 +- .../model/request/UpdateCallRequestStep1.java | 3 +- .../ApplicationEvaluationFormResponse.java | 2 - .../ApplicationEvaluationResponse.java | 2 +- .../AssignedApplicationsResponse.java | 3 +- .../response/CallDetailsResponseBean.java | 2 +- .../model/response/CallResponse.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 7 +++ src/main/resources/message_en.properties | 5 +-- src/main/resources/message_it.properties | 5 +-- 17 files changed, 45 insertions(+), 57 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 0b29c773..8e469734 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -425,7 +425,7 @@ public class GepafinConstant { public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; - public static final String APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE = "appointment.cannot.be.created.by.template"; + public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index ef01dea6..6f326e2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -23,7 +23,6 @@ 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; import java.util.*; @@ -296,7 +295,7 @@ public class ApplicationEvaluationDao { response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); response.setNumberOfCheck(entity.getAssignedApplicationsEntity().getApplication().getCall().getNumberOfCheck()); - response.setProductId(entity.getAssignedApplicationsEntity().getApplication().getCall().getProductId()); + response.setAppointmentTemplateId(entity.getAssignedApplicationsEntity().getApplication().getCall().getAppointmentTemplateId()); } @@ -1157,7 +1156,7 @@ public class ApplicationEvaluationDao { LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); response.setNumberOfCheck(call.getNumberOfCheck()); - response.setProductId(call.getProductId()); + response.setAppointmentTemplateId(call.getAppointmentTemplateId()); 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/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index f6fbd088..876ac53d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -627,7 +627,10 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - Long appointmentTemplateId = hub.getAppointmentTemplateId(); + Long appointmentTemplateId = application.getCall().getAppointmentTemplateId(); + if (appointmentTemplateId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); + } ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, appointmentTemplateId); if (response.getStatusCode() != HttpStatus.OK) { @@ -637,10 +640,10 @@ public class AppointmentDao { // Parse template data String responseDataForTemplate = Utils.convertObjectToJson(response.getBody()); - AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate, application.getCall().getProductId()); + AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate); // Build the appointment request body - AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAppointmentTemplateId(), + AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, appointmentTemplateId, templateRichiestaData); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); @@ -648,16 +651,17 @@ public class AppointmentDao { ResponseEntity appointmentResponse = appointmentApiService.createAppointment(authorizationToken, context, appointmentRequestBody); String appointmentId = extractAppointmentIdFromResponse(appointmentResponse); - if (appointmentId != null) { - // Update application with the appointment ID - application.setAppointmentId(appointmentId); - application.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); - applicationRepository.save(application); - - // Log version history - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + if (appointmentId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_NOT_CREATED)); } + // Update application with the appointment ID + application.setAppointmentId(appointmentId); + application.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); + applicationRepository.save(application); + + // Log version history + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); appointmentCreationResponse.setAppointmentId(appointmentId); return appointmentCreationResponse; @@ -683,12 +687,10 @@ public class AppointmentDao { return null; } - public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse, Long productId) { + public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { try { - if (productId == null) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); - } + ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); @@ -701,7 +703,6 @@ public class AppointmentDao { log.warn("richiesteCliente array is missing or not an array."); return new AppointmentCreationRequest(); } - boolean isMatchedAtLeastOneId = false; for (JsonNode richiestaNode : richiesteClienteArray) { if (richiestaNode.isNull()) continue; @@ -710,11 +711,8 @@ public class AppointmentDao { JsonNode prodottoNode = richiestaNode.path(AppointmentApiConstant.PRODOTTO); String prodottoCode = prodottoNode.path(AppointmentApiConstant.PRODOTTO_CODE).asText(); - if (productId.toString().equals(prodottoCode)) { - isMatchedAtLeastOneId = true; richiestaCliente.setCodProdotto(prodottoCode); richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); - richiestaCliente.setCodProdotto(productId.toString()); richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); @@ -727,11 +725,6 @@ public class AppointmentDao { richiestaClienteList.add(richiestaCliente); } - } - - if (!isMatchedAtLeastOneId) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE)); - } input.setRichiestaCliente(richiestaClienteList); appointmentCreationRequest.setInput(input); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 05c65292..92f2154f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -10,7 +10,6 @@ import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; 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; @@ -31,7 +30,6 @@ 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; @@ -201,7 +199,7 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate()); } assignedApplicationsResponse.setNumberOfCheck(application.getCall().getNumberOfCheck()); - assignedApplicationsResponse.setProductId(application.getCall().getProductId()); + assignedApplicationsResponse.setAppointmentTemplateId(application.getCall().getAppointmentTemplateId()); 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 277fb68c..a913713f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -202,7 +202,7 @@ public class CallDao { callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime())); callEntity.setHub(userEntity.getHub()); callEntity.setNumberOfCheck(createCallRequest.getNumberOfCheck()); - callEntity.setProductId(createCallRequest.getProductId()); + callEntity.setAppointmentTemplateId(createCallRequest.getAppointmentTemplateId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "Create Call" operation. **/ @@ -610,7 +610,7 @@ public class CallDao { 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()); + setIfUpdated(callEntity::getAppointmentTemplateId, callEntity::setAppointmentTemplateId, updateCallRequest.getAppointmentTemplateId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "update call step 1" operation **/ @@ -718,7 +718,7 @@ public class CallDao { callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); callDetailsResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); - callDetailsResponseBean.setProductId(callEntity.getProductId()); + callDetailsResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId()); return callDetailsResponseBean; } @@ -743,7 +743,7 @@ public class CallDao { createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); createCallResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); - createCallResponseBean.setProductId(callEntity.getProductId()); + createCallResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId()); 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 36c370d1..25388138 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -95,7 +95,7 @@ public class CallEntity extends BaseEntity { @Column(name = "NUMBER_OF_CHECK") private Long numberOfCheck; - @Column(name = "PRODUCT_ID") - private Long productId; + @Column(name = "APPOINTMENT_TEMPLATE_ID") + private Long appointmentTemplateId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index ff6db1a6..ccd6c325 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -64,9 +64,6 @@ public class HubEntity extends BaseEntity{ @Column(name = "AREA_CODE") private String areaCode; - @Column(name = "APPOINTMENT_TEMPLATE_ID") - private Long appointmentTemplateId; - @Column(name = "EVALUATION_EXPIRATION_DAYS") private Long evaluationExpirationDays; } 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 c54a1454..7d4bf8cf 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -26,7 +26,7 @@ public class CreateCallRequestStep1 { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; 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 ad55d544..01a0ea39 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.model.request; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.List; import lombok.Data; @@ -43,7 +42,7 @@ public class UpdateCallRequestStep1 { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private EvaluationVersionEnum 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 f71cf808..f51378e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -44,7 +44,5 @@ 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 44f27c13..6ad84281 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -45,7 +45,7 @@ public class ApplicationEvaluationResponse { private LocalDateTime dateAccepted; private LocalDateTime dateRejected; private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; 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 37311ff6..664bc946 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -5,7 +5,6 @@ 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 @@ -25,7 +24,7 @@ public class AssignedApplicationsResponse extends BaseBean { private String companyName; private LocalDateTime evaluationEndDate; private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; 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 76e892d1..7ee0b620 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -59,7 +59,7 @@ public class CallDetailsResponseBean { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; 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 a566ab37..76289b06 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -52,7 +52,7 @@ public class CallResponse { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; @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 9a8ea984..d22b9753 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 @@ -2437,4 +2437,11 @@ + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 87163fb4..c3b03dd7 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -371,6 +371,5 @@ validation.required.requested.amount=The Requested Amount configuration should b company.id.not.null=Company ID cannot be null. formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. -appointment.cannot.be.created = Appointment cannot be created because call doesn't have the productId. -appointment.cannot.be.created.by.template = Product ID does not match with appointment template. - +appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. +appointment.not.created = Appointment not created please try again. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 66da42e2..20705aa8 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -362,6 +362,5 @@ validation.required.requested.amount=La configurazione dell'importo richiesto company.id.not.null=L'ID dell'azienda non pu? essere nullo. formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. -appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID prodotto. -appointment.cannot.be.created.by.template = L'ID prodotto non corrisponde al modello di appuntamento. - +appointment.cannot.be.created = Impossibile creare l'appuntamento perché la chiamata non ha l'ID del modello di appuntamento. +appointment.not.created = Appuntamento non creato, riprova From 028b4a52a1a05885c599a036c49c41cb2bc71a47 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 17 Feb 2025 16:22:29 +0530 Subject: [PATCH 17/50] Updated code. --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 9 --------- 1 file changed, 9 deletions(-) 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 d22b9753..aacc398a 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 @@ -2429,19 +2429,10 @@ - - - - UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' - - - - From 8795af44ce4606f121a24f1ec2f11ef8af793f4e Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 18 Feb 2025 12:35:29 +0530 Subject: [PATCH 18/50] Done ticket GEPAFINBE-170 --- .../tendermanagement/dao/ApplicationDao.java | 8 +++++++- .../tendermanagement/dao/FlowFormDao.java | 2 +- .../repositories/ApplicationRepository.java | 2 ++ .../service/ApplicationService.java | 3 ++- .../service/impl/ApplicationServiceImpl.java | 18 ++++++++++++------ .../web/rest/api/ApplicationApi.java | 1 + .../api/impl/ApplicationApiController.java | 4 ++-- 7 files changed, 27 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 18e522dc..a8e1ca8d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1720,5 +1720,11 @@ public class ApplicationDao { // Step 4: Evaluate the mathematical expression return Utils.evaluateExpression(expression); } - + public ApplicationEntity validateApplicationWithCompany(Long id,Long companyId) { + ApplicationEntity application=applicationRepository.findByIdAndCompanyIdAndIsDeletedFalse(id,companyId); + if (application==null){ + throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + return application; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 404ec854..2287850d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -248,7 +248,7 @@ public class FlowFormDao { // // return applicationFormEntities.isEmpty() ? null : applicationFormEntities.get(0).getForm().getId(); // } - public NextOrPreviousFormResponse getNextOrPreviousForm(ApplicationEntity applicationEntity, Long formId, + public NextOrPreviousFormResponse getNextOrPreviousForm(ApplicationEntity applicationEntity,Long companyId, Long formId, FormActionEnum action) { Long calculatedFormId = null; FormEntity formEntity = null; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 5ed76d55..6eba956e 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -162,4 +162,6 @@ public interface ApplicationRepository extends JpaRepository findByUserIdAndUserWithCompany_IdAndCall_IdAndIsDeletedFalseAndStatusNot( Long userId, Long userWithCompanyId, Long callId, String status ); + + ApplicationEntity findByIdAndCompanyIdAndIsDeletedFalse(Long id,Long companyId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 24935ca9..4565668c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -29,7 +29,7 @@ public interface ApplicationService { public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId); - public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action); + public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId,Long companyId, Long formId, FormActionEnum action); public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); @@ -45,4 +45,5 @@ public interface ApplicationService { PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean); + public ApplicationEntity validateApplicationWithCompany(Long applicationId,Long companyId); } 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 c5d937a2..77887539 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -72,13 +72,14 @@ public class ApplicationServiceImpl implements ApplicationService { validator.validateUserWithCall(userEntity, callId); return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); } - + @Override - public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, - FormActionEnum action) { - ApplicationEntity applicationEntity = validateApplication(applicationId); - validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - return flowFormDao.getNextOrPreviousForm(applicationEntity, formId, action); + public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long companyId, Long formId, + FormActionEnum action) { + validator.validateUserWithCompany(request, companyId); + validateApplication(applicationId); + ApplicationEntity applicationEntity = validateApplicationWithCompany(applicationId, companyId); + return flowFormDao.getNextOrPreviousForm(applicationEntity, companyId, formId, action); } @Override @@ -135,4 +136,9 @@ public class ApplicationServiceImpl implements ApplicationService { return applicationDao.getAllApplicationByPagination(userEntity,callId,companyId,applicationPageableRequestBean); } + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationEntity validateApplicationWithCompany(Long applicationId,Long companyId) { + return applicationDao.validateApplicationWithCompany(applicationId,companyId); + } } 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 6b98b3f3..bc2f3cb9 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 @@ -114,6 +114,7 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}/form/next-previous", produces = "application/json") ResponseEntity> getNextOrPreviousForm(HttpServletRequest request, @Parameter(description = "The applicaltion id", required = true) @PathVariable("applicationId") Long applicationId, + @Parameter(description = "The company id", required = true) @RequestParam("companyId") Long companyId, @Parameter(description = "The form id", required = false) @RequestParam(value = "formId", required = false) Long formId, @RequestParam(value = "action", required = false) FormActionEnum action); 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 ccf386c7..a9c148bb 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 @@ -116,13 +116,13 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity> getNextOrPreviousForm(HttpServletRequest request, Long applicationId, + public ResponseEntity> getNextOrPreviousForm(HttpServletRequest request, Long applicationId,Long companyId, Long formId, FormActionEnum action) { /** This code is responsible for creating user action logs for the "get next or previous form" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_NEXT_PREVIOUS_FORM).build()); - NextOrPreviousFormResponse data = applicationService.getNextOrPreviousForm(request, applicationId, formId, action); + NextOrPreviousFormResponse data = applicationService.getNextOrPreviousForm(request, applicationId,companyId, formId, action); log.info("Get Next Or Previous Form "); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); From f1b311236c5f28b6bc007eb74790ea2aac221878 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 18 Feb 2025 15:19:20 +0530 Subject: [PATCH 19/50] Updated companyId as optional in next-prev API --- .../service/impl/ApplicationServiceImpl.java | 16 +++++++++++++--- .../web/rest/api/ApplicationApi.java | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) 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 77887539..aaea72e8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -76,9 +76,19 @@ public class ApplicationServiceImpl implements ApplicationService { @Override public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long companyId, Long formId, FormActionEnum action) { - validator.validateUserWithCompany(request, companyId); - validateApplication(applicationId); - ApplicationEntity applicationEntity = validateApplicationWithCompany(applicationId, companyId); + if (companyId !=null) { + validator.validateUserWithCompany(request, companyId); + } + ApplicationEntity applicationEntity =null; + if(validator.checkIsBeneficiary()){ + if(companyId==null){ + throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); + } + applicationEntity = validateApplicationWithCompany(applicationId, companyId); + + }else { + applicationEntity=validateApplication(applicationId); + } return flowFormDao.getNextOrPreviousForm(applicationEntity, companyId, formId, action); } 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 bc2f3cb9..9db1d79e 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 @@ -114,7 +114,7 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}/form/next-previous", produces = "application/json") ResponseEntity> getNextOrPreviousForm(HttpServletRequest request, @Parameter(description = "The applicaltion id", required = true) @PathVariable("applicationId") Long applicationId, - @Parameter(description = "The company id", required = true) @RequestParam("companyId") Long companyId, + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId",required = false) Long companyId, @Parameter(description = "The form id", required = false) @RequestParam(value = "formId", required = false) Long formId, @RequestParam(value = "action", required = false) FormActionEnum action); From 051d1488a5c6cb2fb73d02ca0b435d26a93cfcd9 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 18 Feb 2025 16:52:54 +0530 Subject: [PATCH 20/50] Added fields in evaluation API response --- .../gepafin/tendermanagement/dao/ApplicationEvaluationDao.java | 3 ++- .../model/response/ApplicationEvaluationFormResponse.java | 2 ++ 2 files changed, 4 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 6f326e2c..c42eec88 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -2201,7 +2201,8 @@ public class ApplicationEvaluationDao { ApplicationEvaluationFormResponse response = objectMapper.convertValue(convertedResponse, ApplicationEvaluationFormResponse.class); EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByCallIdAndIsDeletedFalse(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId()); - + response.setNumberOfCheck(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getNumberOfCheck()); + response.setAppointmentTemplateId(evaluationEntity.getAssignedApplicationsEntity().getApplication().getApplicationEvaluationId()); if (evaluationFormEntity != null) { 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 f51378e0..0b12a4a6 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 Long numberOfCheck; + private Long appointmentTemplateId; } From 869c8f3f7d14edef71b9c381bf8125e3a4578de1 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 18 Feb 2025 17:47:40 +0530 Subject: [PATCH 21/50] Updated status code for validation in next-prev API --- .../tendermanagement/service/impl/ApplicationServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 aaea72e8..c98ded2b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -17,6 +17,7 @@ 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; +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.Service; @@ -82,7 +83,7 @@ public class ApplicationServiceImpl implements ApplicationService { ApplicationEntity applicationEntity =null; if(validator.checkIsBeneficiary()){ if(companyId==null){ - throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); + throw new ForbiddenAccessException(Status.FORBIDDEN,Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); } applicationEntity = validateApplicationWithCompany(applicationId, companyId); From 194cf6a97ffa6481919226b59db8896d53af030c Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 19 Feb 2025 16:12:38 +0530 Subject: [PATCH 22/50] Added two fields in the response of get amendment api --- .../gepafin/tendermanagement/dao/AssignedApplicationsDao.java | 2 ++ .../model/response/AssignedApplicationsResponse.java | 3 ++- 2 files changed, 4 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 92f2154f..ad156cf4 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 { } assignedApplicationsResponse.setNumberOfCheck(application.getCall().getNumberOfCheck()); assignedApplicationsResponse.setAppointmentTemplateId(application.getCall().getAppointmentTemplateId()); + assignedApplicationsResponse.setNdg(application.getNdg()); + assignedApplicationsResponse.setAppointmentId(application.getAppointmentId()); return assignedApplicationsResponse; } 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 664bc946..7f80e8f0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -26,7 +26,8 @@ public class AssignedApplicationsResponse extends BaseBean { private Long numberOfCheck; private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; - + private String ndg; + private String appointmentId; } From cc19a1b76389102b4d77775747f0ecd2f3f55fc7 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 20 Feb 2025 11:56:12 +0530 Subject: [PATCH 23/50] Done ticket GEPAFINBE-172 --- .../constants/GepafinConstant.java | 4 ++ .../dao/ApplicationAmendmentRequestDao.java | 64 ++++++++++++++++--- ...licationEvaluationFormFieldRepository.java | 8 +++ .../gepafin/tendermanagement/util/Utils.java | 4 +- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 6 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8e469734..4bf0f7fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -426,6 +426,10 @@ public class GepafinConstant { public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; + + public static final String SWITCH="switch"; + public static final String IS_CHECK_LIST_ITEM="isChecklistItem"; + public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index ab5a159b..6caf7e71 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -119,6 +119,15 @@ public class ApplicationAmendmentRequestDao { @Autowired private UserRepository userRepository; + @Autowired + private EvaluationFormRepository evaluationFormRepository; + + @Autowired + private ApplicationEvaluationFormFieldRepository applicationEvaluationFormFieldRepository; + + @Autowired + private ApplicationEvaluationFormRepository applicationEvaluationFormRepository; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -132,16 +141,10 @@ public class ApplicationAmendmentRequestDao { if(file != null){ evaluationFileRequests=Utils.convertJsonStringToList(file,FieldRequest.class); } - Boolean allValid = evaluationFileRequests.stream() - .anyMatch(fieldRequest -> fieldRequest.getValid() == null); - if(checkList != null) { - checklistRequests=Utils.convertJsonStringToList(checkList,ChecklistRequest.class); - } - boolean resultCheckList = checklistRequests.stream() - .anyMatch(checklistRequest -> Boolean.TRUE.equals(checklistRequest.getValid())) ? false : true; - - if(Boolean.TRUE.equals(allValid) || Boolean.TRUE.equals(resultCheckList)){ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.All_DOCUMENT_CHECKED_AND_ONE_CHECKLIST_CHECKED)); + if(applicationEvaluationEntity.getEvaluationVersion().equals(EvaluationVersionEnum.V1.getValue())) { + checklistValidationForEvaluationV1(evaluationFileRequests, checkList, checklistRequests); + } else if (applicationEvaluationEntity.getEvaluationVersion().equals(EvaluationVersionEnum.V2.getValue())) { + validationCheckEvaluationV2(applicationEvaluationEntity, application); } // Set common application-level details String callName = application.getCall().getName(); @@ -186,6 +189,47 @@ public class ApplicationAmendmentRequestDao { return response; } + private void validationCheckEvaluationV2(ApplicationEvaluationEntity applicationEvaluationEntity, ApplicationEntity application) { + Long callId= applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId(); + EvaluationFormEntity evaluationFormEntity=evaluationFormRepository.findByCallIdAndIsDeletedFalse(callId); + Long numberOfCheck= application.getCall().getNumberOfCheck(); + ApplicationEvaluationFormEntity applicationEvaluationForm=applicationEvaluationFormRepository.findByApplicationEvaluation_IdAndIsDeletedFalse(applicationEvaluationEntity.getId()); + List contentResponseBeans=Utils.convertJsonStringToList(evaluationFormEntity.getContent(),ContentResponseBean.class); + int count = 0; + for (ContentResponseBean content : contentResponseBeans) { + if (GepafinConstant.SWITCH.equals(content.getName()) && content.getSettings().stream() + .anyMatch(setting -> GepafinConstant.IS_CHECK_LIST_ITEM.equals(setting.getName()))) { + + ApplicationEvaluationFormFieldEntity field = applicationEvaluationFormFieldRepository + .findByFieldIdAndApplicationEvaluationFormId(content.getId(), applicationEvaluationForm.getId()); + + if (field != null && Utils.isValidBoolean(field.getFieldValue())) { + Boolean fieldValueAsBoolean = Boolean.parseBoolean(field.getFieldValue()); + + if (Boolean.FALSE.equals(fieldValueAsBoolean)) { + throw new CustomValidationException(Status.VALIDATION_ERROR,GepafinConstant.VALIDATION_FAILED_FOR_CHECKLIST); + } + + if (++count >= numberOfCheck) break; + } + } + } + } + + private static void checklistValidationForEvaluationV1(List evaluationFileRequests, String checkList, List checklistRequests) { + Boolean allValid = evaluationFileRequests.stream() + .anyMatch(fieldRequest -> fieldRequest.getValid() == null); + if(checkList != null) { + checklistRequests =Utils.convertJsonStringToList(checkList,ChecklistRequest.class); + } + boolean resultCheckList = checklistRequests.stream() + .anyMatch(checklistRequest -> Boolean.TRUE.equals(checklistRequest.getValid())) ? false : true; + + if(Boolean.TRUE.equals(allValid) || Boolean.TRUE.equals(resultCheckList)){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.All_DOCUMENT_CHECKED_AND_ONE_CHECKLIST_CHECKED)); + } + } + public List getIdAndLabelFromResult(List> result) { List formFieldResponses = new ArrayList<>(); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java index 07a0d318..0f64e218 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java @@ -15,4 +15,12 @@ public interface ApplicationEvaluationFormFieldRepository extends JpaRepository< "AND f.isDeleted = false") List findByApplicationEvaluationFormId( @Param("applicationEvaluationFormId") Long applicationEvaluationFormId); + + @Query("SELECT f FROM ApplicationEvaluationFormFieldEntity f " + + "WHERE f.applicationEvaluationForm.id = :applicationEvaluationFormId " + + "AND f.fieldId = :fieldId " + + "AND f.isDeleted = false") + ApplicationEvaluationFormFieldEntity findByFieldIdAndApplicationEvaluationFormId( + @Param("fieldId") String fieldId, + @Param("applicationEvaluationFormId") Long applicationEvaluationFormId); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index f444d69d..06abaaab 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -785,5 +785,7 @@ public class Utils { return input.matches("-?\\d+(\\.\\d+)?"); } - + public static boolean isValidBoolean(String value) { + return "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value); + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index c3b03dd7..9cf0149a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -373,3 +373,4 @@ formula.amount.not.matches.requested.amount= The {0} does not matches to calcula appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. appointment.not.created = Appointment not created please try again. +validation.failed.checklist=Validation failed for checklist. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 20705aa8..7ab7b2b4 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -364,3 +364,4 @@ formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo c appointment.cannot.be.created = Impossibile creare l'appuntamento perché la chiamata non ha l'ID del modello di appuntamento. appointment.not.created = Appuntamento non creato, riprova +validation.failed.checklist=Convalida fallita per la checklist. From ad505f507d378bf9ebf2cce3c9dcdf08a61d0c71 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 24 Feb 2025 16:16:06 +0530 Subject: [PATCH 24/50] PEC service is enabled only on the production server --- .../tendermanagement/dao/ApplicationDao.java | 4 +-- .../service/impl/PecEmailService.java | 25 ++++++++++++------- src/main/resources/application-dev.properties | 3 ++- .../resources/application-local.properties | 3 ++- .../application-production.properties | 3 ++- .../resources/application-testing.properties | 3 ++- 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a8e1ca8d..8503b05b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -117,8 +117,8 @@ public class ApplicationDao { @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; - @Value("${default_System_Receiver_Email}") - private String defaultSystemReceiverEmail; +// @Value("${default_System_Receiver_Email}") +// private String defaultSystemReceiverEmail; @Value("${rinaldo_email}") private String rinaldoEmail; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java index 4d076bb4..67e58c2d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -26,6 +26,9 @@ public class PecEmailService implements EmailService { @Value("${isMailSendingEnabled}") private String isEmailSendingEnabled; + @Value("${isPecServiceEnabled}") + private String isPecServiceEnabled; + @Autowired private Validator validator; @@ -55,23 +58,27 @@ public class PecEmailService implements EmailService { emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(emailRequest.getRecipient())); try { - Unirest.setTimeouts(0, 0); - response2 = Unirest.post(url) - .header("Authorization", "Bearer " + authToken) - .header("Content-Type", "application/json") - .body(Utils.convertObjectToJson(emailRequest)) // Serialize the emailRequest object to JSON - .asString(); + if (Boolean.TRUE.equals(Boolean.parseBoolean(isPecServiceEnabled))) { + Unirest.setTimeouts(0, 0); + response2 = Unirest.post(url) + .header("Authorization", "Bearer " + authToken) + .header("Content-Type", "application/json") + .body(Utils.convertObjectToJson(emailRequest)) // Serialize the emailRequest object to JSON + .asString(); + } }catch(Exception e) { emailLogRequest.setSendStatus(StatusTypeEnum.FAILED.getValue()); emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); emailLogRequest.setErrorMessage(e.getMessage()); - EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); + emailLogDao.createEmailLog(emailLogRequest); throw new RuntimeException("Failed to send email via PEC: " + response2.getStatus()); } - emailLogRequest.setEmailServiceResponse(response2.getBody()); + if(response2 != null) { + emailLogRequest.setEmailServiceResponse(response2.getBody()); + } } emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.PEC_SERVICE); - EmailLogEntity emailLogEntity= emailLogDao.createEmailLog(emailLogRequest); + emailLogDao.createEmailLog(emailLogRequest); } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 87a38095..b865c960 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -10,7 +10,8 @@ spring.h2.console.enabled=true isVatCheckGloballyDisabled = false isMailSendingEnabled = true -default_System_Receiver_Email=antonio.manca@bflows.net +isPecServiceEnabled = false +#default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=rinaldo.bonazzo@bflows.net rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=test@test.test diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index e52a9577..1f1f0eb0 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -9,7 +9,8 @@ spring.jpa.show-sql=true base-url=http://localhost:8080 isMailSendingEnabled = false -default_System_Receiver_Email=test@test.test +isPecServiceEnabled = false +#default_System_Receiver_Email=test@test.test gepafin_email=test@test.test rinaldo_email=test@test.test carlo_email=test@test.test diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 8c181965..d941e7fc 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -16,7 +16,8 @@ spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production isMailSendingEnabled = true -default_System_Receiver_Email=m.gaudino@gepafin.it,f.marinelli@gepafin.it +isPecServiceEnabled = true +#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 diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 8ee53329..7c5751c4 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -7,7 +7,8 @@ spring.datasource.password=sa spring.h2.console.enabled=true base-url=http://localhost:8080 isMailSendingEnabled = false -default_System_Receiver_Email=test@test.test +isPecServiceEnabled = false +#default_System_Receiver_Email=test@test.test gepafin_email=test@test.test rinaldo_email=test@test.test carlo_email=test@test.test From 486e8256a2868e85b010fc0b0cbf77a80163a083 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 24 Feb 2025 16:59:33 +0530 Subject: [PATCH 25/50] Fixed pdf sequence issue --- .../net/gepafin/tendermanagement/dao/PdfDao.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 8247c321..0569e28d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -285,12 +285,12 @@ public class PdfDao { private Document createPdfTable(List> extractedData, Document document, ContentResponseBean contentResponseBean) throws DocumentException { // Create a PdfPTable with dynamic column count based on stateFieldMap size - Map stateFieldMap = new HashMap<>(); - Map stateFieldBoolean = new HashMap<>(); - Map formulaEnabledMap = new HashMap<>(); - Map formulaTypeMap = new HashMap<>(); - Map fieldTypeMap = new HashMap<>(); - Map totalMap = new HashMap<>(); + Map stateFieldMap = new LinkedHashMap<>(); + Map stateFieldBoolean = new LinkedHashMap<>(); + Map formulaEnabledMap = new LinkedHashMap<>(); + Map formulaTypeMap = new LinkedHashMap<>(); + Map fieldTypeMap = new LinkedHashMap<>(); + Map totalMap = new LinkedHashMap<>(); Font lightGrayFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(110, 110, 110)); // Light gray From c2e8fa321c4eb711a0f7af09611dff5f82733ce5 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 24 Feb 2025 18:04:34 +0530 Subject: [PATCH 26/50] Done ticket GEPAFINBE-169 --- .../constants/GepafinConstant.java | 13 ++ .../dao/ApplicationEvaluationDao.java | 159 +++++++++++++++++- .../gepafin/tendermanagement/dao/FormDao.java | 26 +-- .../model/request/FieldValidatorBean.java | 4 + ...licationEvaluationFormFieldRepository.java | 13 ++ .../tendermanagement/util/FieldValidator.java | 76 +++++++-- src/main/resources/message_en.properties | 6 + src/main/resources/message_it.properties | 5 + 8 files changed, 271 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index f696cdb0..c2e648ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -423,6 +423,19 @@ public class GepafinConstant { 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 LABEL="label"; + public static final String FORMULA="formula"; + public static final String VARIABLE="variable"; + public static final String TOTAL="total"; + public static final String NUMBER_INPUT="numberinput"; + public static final String CHECK_BOXES="checkboxes"; + public static final String VALIDATION_FIELD_MAX = "validation.field.max_value"; + public static final String VALIDATION_FIELD_MIN = "validation.field.min_value"; + public static final String VALIDATION_FIELD_MAX_CHECK_BOX = "validation.field.max.checkbox"; + public static final String VALIDATION_FIELD_MIN_CHECK_BOX = "validation.field.min.checkbox"; + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index ef01dea6..b26c007b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -17,6 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -29,6 +30,7 @@ import java.time.temporal.ChronoUnit; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -1968,7 +1970,9 @@ public class ApplicationEvaluationDao { //Handling Application Evaluation form EvaluationFormEntity evaluationFormEntity = evaluationFormService.validateEvaluationForm(evaluationFormId); validateFormFields(applicationEvaluationFormRequestBean,evaluationFormEntity); +// formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); // ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByAssignedApplicationsId(assignedApplicationId); + validateFormFieldCustom(applicationEvaluationFormRequestBean.getFormFields(),entity,evaluationFormEntity); ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,entity); createOrUpdateMultipleFormFields(applicationEvaluationFormRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); return processEvaluationForm(entity); @@ -2024,17 +2028,20 @@ public class ApplicationEvaluationDao { public List createOrUpdateMultipleFormFields(List formFieldRequestBeans, ApplicationEvaluationFormEntity applicationEvaluationFormEntity, EvaluationFormEntity evaluationFormEntity) { + FieldValidator fieldValidator = FieldValidator.create(); List existingFields = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormId(applicationEvaluationFormEntity.getId()); - return formFieldRequestBeans.stream().map(requestBean -> createOrUpdateApplicationEvaluationFormField(requestBean, applicationEvaluationFormEntity, existingFields, evaluationFormEntity)) + List applicationEvaluationFormFieldEntities= formFieldRequestBeans.stream().map(requestBean -> createOrUpdateApplicationEvaluationFormField(requestBean, applicationEvaluationFormEntity, existingFields, evaluationFormEntity,fieldValidator)) .collect(Collectors.toList()); + fieldValidator.validate(); + return applicationEvaluationFormFieldEntities; } public ApplicationEvaluationFormFieldEntity createOrUpdateApplicationEvaluationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationEvaluationFormEntity applicationEvaluationFormEntity, List applicationEvaluationFormFieldEntities, - EvaluationFormEntity evaluationFormEntity){ + EvaluationFormEntity evaluationFormEntity,FieldValidator fieldValidator){ ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity = new ApplicationEvaluationFormFieldEntity(); validateFileUploadDocuments(applicationFormFieldRequestBean, evaluationFormEntity); VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; @@ -2057,7 +2064,8 @@ public class ApplicationEvaluationDao { } } Utils.setIfUpdated(applicationEvaluationFormFieldEntity::getFieldId, applicationEvaluationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId()); - + List contentBeans = Utils.convertJsonStringToList(evaluationFormEntity.getContent(), ContentResponseBean.class); + calculationProcessForFormula(applicationEvaluationFormEntity,contentBeans,applicationFormFieldRequestBean,fieldValidator); if (applicationFormFieldRequestBean.getFieldValue() != null) { applicationEvaluationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue())); } else { @@ -2266,5 +2274,150 @@ public class ApplicationEvaluationDao { return request; } + + public void calculationProcessForFormula(ApplicationEvaluationFormEntity 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(GepafinConstant.LABEL)){ + label= String.valueOf(settingResponseBean.getValue()); + } + + if(settingResponseBean.getName().equals(GepafinConstant.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 -> GepafinConstant.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 = applicationEvaluationFormFieldRepository.findByApplicationEvaluationFormIdAndFieldIdAndIsDeletedFalse(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 -> GepafinConstant.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(GepafinConstant.TOTAL); + + } + + updatedMappedFormulaValue.put(fieldId, entityFieldValue); + }); + } + if(formulaValueOpt==null || formulaValueOpt.isEmpty()){ + return; + } + double finalValue = applicationDao.evaluateFormula(formulaValueOpt, mappedFormulaValue, updatedMappedFormulaValue); + + fieldValidator.formulaValidation(fieldValue, finalValue, label); + } + public void validateFormFieldCustom(List applicationFormFieldRequestList, ApplicationEvaluationEntity applicationEvaluationEntity, EvaluationFormEntity evaluationFormEntity) { + Map formFieldMap = new LinkedHashMap(); + for(ApplicationFormFieldRequestBean applicationFormFieldRequestBean:applicationFormFieldRequestList) { + if(applicationFormFieldRequestBean.getFieldValue()==null ) + continue; + if (applicationFormFieldRequestBean.getFieldValue() != null ) { + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); +// formDao.checkObjectData(applicationFormFieldRequestBean.getFieldId(), fieldValue, formFieldMap); + if (fieldValue instanceof List) { + List list = (List) fieldValue; + + // Only map if the list is not empty and contains Strings + if (!list.isEmpty() && list.get(0) instanceof String) { + for (Object value : list) { + formDao.setFormFieldMap(applicationFormFieldRequestBean.getFieldId(), formFieldMap, value); + } + }else if (list.stream().allMatch(item -> item instanceof Map map && + map.keySet().stream().allMatch(String.class::isInstance))) { + if (fieldValue != null) { + formFieldMap.put(applicationFormFieldRequestBean.getFieldId(), fieldValue); + } + } else formDao.setFormFieldMap(applicationFormFieldRequestBean.getFieldId(), formFieldMap, fieldValue); + } + else { + formDao.setFormFieldMap(applicationFormFieldRequestBean.getFieldId(), formFieldMap, fieldValue); + } + }} + + EvaluationFormResponseBean evaluationFormResponseBean = evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity); + ApplicationEvaluationFormEntity applicationEvaluationForm=applicationEvaluationFormRepository.findByEvaluationIdAndEvaluationFormId(applicationEvaluationEntity.getId(),evaluationFormEntity.getId()); + Boolean isApplicationFormExist= getApplicationEvaluationFormExist(applicationEvaluationForm); + FieldValidator validator = FieldValidator.create(); + evaluationFormResponseBean.getContent().forEach(contentResponseBean -> { + String fieldId = contentResponseBean.getId(); + String fieldLabel=contentResponseBean.getLabel(); + Object object=formFieldMap.get(fieldId); + String value =Utils.convertToStringForFormFieldValue(object); + if(value == null && isApplicationFormExist) { + return; + } + FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); + validator + .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel,fieldValidatorBean.getMin(),contentResponseBean) // Only applies if minLength is not null + .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel,fieldValidatorBean.getMax(),contentResponseBean) // Only applies if maxLength is not null + .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present + .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here + }); + validator.validate(); + } + private Boolean getApplicationEvaluationFormExist(ApplicationEvaluationFormEntity applicationEvaluationFormEntity) { + if(applicationEvaluationFormEntity !=null) { + return true; + } + return false; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 4311076f..702a3b44 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -415,8 +415,8 @@ public class FormDao { } FieldValidatorBean fieldValidatorBean = Utils.convertSourceObjectToDestinationObject(contentResponseBean.getValidators(), FieldValidatorBean.class); validator - .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel) // Only applies if minLength is not null - .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel) // Only applies if maxLength is not null + .minLength(value, fieldValidatorBean.getMinLength(), fieldLabel,fieldValidatorBean.getMin(),contentResponseBean) // Only applies if minLength is not null + .maxLength(value, fieldValidatorBean.getMaxLength(), fieldLabel,fieldValidatorBean.getMax(),contentResponseBean) // Only applies if maxLength is not null .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { @@ -429,28 +429,34 @@ public class FormDao { validator.validate(); } - private void checkObjectData(String fieldId, Object fieldValue, Map formFieldMap) { - if (fieldValue instanceof List) { + public void checkObjectData(String fieldId, Object fieldValue, Map formFieldMap) { + if (fieldValue instanceof List) { List list = (List) fieldValue; // Only map if the list is not empty and contains Strings - if (!list.isEmpty() && list.get(0) instanceof String) { + if (list.stream().allMatch(item -> item instanceof String)) { + formFieldMap.put(fieldId, list); + } + else if (!list.isEmpty() && list.get(0) instanceof String) { for (Object value : list) { setFormFieldMap(fieldId, formFieldMap, value); } - }else if (list.stream().allMatch(item -> item instanceof Map map && + } + 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))) { + public void setFormFieldMap(String fieldId, Map formFieldMap, Object value) { + if(value !=null){ + String fieldValue= String.valueOf(value); + if(Boolean.FALSE.equals(StringUtils.isEmpty(fieldValue))) { formFieldMap.put(fieldId, value); - } + } } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java index be94ffc0..3c199589 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FieldValidatorBean.java @@ -11,6 +11,10 @@ public class FieldValidatorBean { private Long maxLength; + private Long min; + + private Long max; + private String pattern; private String custom; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java index 07a0d318..ea12bd96 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationFormFieldRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface ApplicationEvaluationFormFieldRepository extends JpaRepository { @@ -15,4 +16,16 @@ public interface ApplicationEvaluationFormFieldRepository extends JpaRepository< "AND f.isDeleted = false") List findByApplicationEvaluationFormId( @Param("applicationEvaluationFormId") Long applicationEvaluationFormId); + + Optional findByApplicationEvaluationFormIdAndFieldIdAndIsDeletedFalse(Long applicationEvaluationFormId, String fieldId); + + @Query("SELECT f FROM ApplicationEvaluationFormFieldEntity f " + + "WHERE f.applicationEvaluationForm.id = :applicationEvaluationFormId " + + "AND f.fieldId IN :fieldIds " + + "AND f.isDeleted = false") + List findByApplicationEvaluationFormIdAndFieldIds( + @Param("applicationEvaluationFormId") Long applicationEvaluationFormId, + @Param("fieldIds") List fieldIds); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 7a4e24b8..fa881383 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -59,16 +59,56 @@ public class FieldValidator { throw new ValidationException(Status.VALIDATION_ERROR, errors, Translator.toLocale(GepafinConstant.VALIDATION_MESSAGE)); } } - public FieldValidator minLength(String value, Long minLength, String fieldLabel) { - if (minLength != null && value != null && value.length() < minLength) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldLabel, minLength)); - } + public FieldValidator minLength(String value, Long minLength, String fieldLabel,Long min,ContentResponseBean contentResponseBean) { + if (value != null) { + if(min!=null) { + if(contentResponseBean.getName().equals(GepafinConstant.NUMBER_INPUT)) { + long numericValue = Long.parseLong(value); // Convert String to Long + if (numericValue < min) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN), fieldLabel, min)); + } + } + else if(contentResponseBean.getName().equals(GepafinConstant.CHECK_BOXES)){ + List check = Utils.convertJsonStringToList(value,String.class); + if (check== null || check.size() < min) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_CHECK_BOX), fieldLabel, min)); + } + } + } + if(minLength!=null) { + if (value.length() < minLength) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN_LENGTH), fieldLabel, minLength)); + } + } + } return this; } - public FieldValidator maxLength(String value, Long maxLength, String fieldLabel) { - if (maxLength != null && value != null && value.length() > maxLength) { - errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldLabel, maxLength)); + public FieldValidator maxLength(String value, Long maxLength, String fieldLabel, Long max, ContentResponseBean contentResponseBean) { + if (value != null) { + if (max != null) { + if(contentResponseBean.getName().equals(GepafinConstant.NUMBER_INPUT)) { + long numericValue = Long.parseLong(value); // Convert String to Long + if (numericValue > max) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX), fieldLabel, max)); + } + } + else if(contentResponseBean.getName().equals(GepafinConstant.CHECK_BOXES)){ + List check = Utils.convertJsonStringToList(value,String.class); + if (check== null || check.size() > max) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_CHECK_BOX), fieldLabel, max)); + } + } + } + if (maxLength != null) { + if (value.length() > maxLength) { + errors.add(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX_LENGTH), fieldLabel, maxLength)); + } + } } return this; } @@ -167,12 +207,12 @@ public class FieldValidator { switch (customRule) { case GepafinConstant.NON_EMPTY_TABLES: - try { - checkTableValidation(value, fieldId, contentResponseBean, errors); - } catch (Exception e) { - throw new RuntimeException(e); - } - break; + try { + checkTableValidation(value, fieldId, contentResponseBean, errors); + } catch (Exception e) { + throw new RuntimeException(e); + } + break; } return this; @@ -187,13 +227,13 @@ public class FieldValidator { .orElse(null); // Default to null if no match if (tableType!=null){ - try { + try { Object object = PdfUtils.extractRows(value);; value= Utils.convertToString(object); - } catch (Exception e) { - throw new RuntimeException(e); - } - } + } catch (Exception e) { + throw new RuntimeException(e); + } + } contentResponseBean.getSettings().stream() .filter(setting -> "table_columns".equals(setting.getName()) || GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(setting.getName())) // Check for "table_columns" diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7aab6f08..159209d3 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -166,6 +166,11 @@ validation.field.max_length=Field {0} must be no more than {1} characters long. validation.field.pattern=Field {0} does not match the required pattern. validation.field.not_null=Field {0} must not be null. validation.field.not_empty=Field {0} must not be empty. +validation.field.max_value=Field {0} must be no more than {1}. +validation.field.min_value=Field {0} must be greater than {1}. +validation.field.min.checkbox=Field {0} should be checked for atleast {1}. +validation.field.max.checkbox=Field {0} should have only {1} checked. + current.form.incomplete=Current form is not filled. flow.not.found=Flow not found. @@ -372,3 +377,4 @@ company.id.not.null=Company ID cannot be null. 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 c1794a8d..d51d07c1 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -160,6 +160,11 @@ validation.field.max_length=Il campo {0} deve essere lungo al massimo {1} caratt validation.field.pattern=Il campo {0} non corrisponde al modello richiesto. validation.field.not_null=Il campo {0} non deve essere nullo. validation.field.not_empty=Il campo {0} non deve essere vuoto. +validation.field.max_value=Il campo {0} non deve essere più grande di {1}. +validation.field.min_value=Il campo {0} deve essere maggiore di {1}. +validation.field.min.checkbox=Il campo {0} dovrebbe essere controllato almeno per {1}. +validation.field.max.checkbox=Il campo {0} dovrebbe avere solo {1} selezionato. + current.form.incomplete=il modulo corrente non ? compilato flow.not.found=Flow not found. validation.message=Messaggi di convalida. From fac0c3e2ec42e72b631c52681d85a50a8cfebe43 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 25 Feb 2025 11:57:30 +0530 Subject: [PATCH 27/50] Done ticket GEPAFINBE-167 --- .../constants/GepafinConstant.java | 15 + .../tendermanagement/dao/CategoryDao.java | 113 ++++++ .../dao/CompanyDocumentDao.java | 337 ++++++++++++++++++ .../tendermanagement/dao/DocumentDao.java | 2 +- .../tendermanagement/dao/NotificationDao.java | 24 +- .../tendermanagement/dao/S3PathConfig.java | 27 ++ .../entities/CategoryEntity.java | 22 ++ .../entities/CompanyDocumentEntity.java | 46 +++ .../enums/CompanyDocSourceTypeEnum.java | 19 + .../enums/CompanyDocumentStatusEnum.java | 17 + .../enums/CompanyDocumentTypeEnum.java | 16 + .../enums/ExpirationTypeEnum.java | 3 +- .../enums/NotificationTypeEnum.java | 3 +- .../enums/UserActionContextEnum.java | 16 +- .../model/request/CategoryRequest.java | 9 + .../model/request/CompanyDocumentRequest.java | 12 + .../model/response/CategoryResponse.java | 11 + .../response/CompanyDocumentResponseBean.java | 29 ++ .../repositories/CategoryRepository.java | 9 + .../CompanyDocumentRepository.java | 41 +++ .../CompanyDocumentExpirationScheduler.java | 113 ++++++ .../service/CategoryService.java | 13 + .../service/CompanyDocumentService.java | 29 ++ .../service/impl/AmazonS3ServiceImpl.java | 6 +- .../service/impl/CategoryServiceImpl.java | 51 +++ .../impl/CompanyDocumentServiceImpl.java | 66 ++++ .../web/rest/api/CategoryApi.java | 85 +++++ .../web/rest/api/CompanyDocumentApi.java | 122 +++++++ .../rest/api/impl/CategoryApiController.java | 83 +++++ .../impl/CompanyDocumentApiControlller.java | 118 ++++++ .../db/changelog/db.changelog-1.0.0.xml | 98 +++++ ...d_expiration_scheduler_data_24_02_2025.sql | 3 + ...n_template_for_notification_24_02_2025.sql | 2 + src/main/resources/message_en.properties | 13 + src/main/resources/message_it.properties | 13 + 35 files changed, 1573 insertions(+), 13 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/CompanyDocSourceTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentStatusEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CompanyDocumentRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/scheduler/CompanyDocumentExpirationScheduler.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/CategoryService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java create mode 100644 src/main/resources/db/dump/updated_expiration_scheduler_data_24_02_2025.sql create mode 100644 src/main/resources/db/dump/updated_json_template_for_notification_24_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 f696cdb0..20a6c731 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -423,6 +423,21 @@ public class GepafinConstant { 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 COMPANY_DOCUMENT_NOT_FOUND = "company.document.not.found"; + public static final String COMPANY_DOCUMENT_UPDATED_SUCCESSFULLY = "company.document.updated.successfully"; + public static final String COMPANY_DOCUMENT_COPIED_SUCCESSFULLY = "company.document.copied.successfully"; + public static final String COMPANY_DOCUMENT_FETCHED_SUCCESSFULLY = "company.document.fetched.successfully"; + + public static final String DOCUMENT_CATEGORY_CREATE_SUCCESS = "document.category.success"; + public static final String DOCUMENT_CATEGORY_GET_SUCCESS = "document.category.get.success"; + public static final String DOCUMENT_CATEGORY_NOT_FOUND = "document.category.not.found"; + public static final String DOCUMENT_CATEGORY_DELETE_SUCCESS = "document.category.delete.success"; + public static final String DOCUMENT_CATEGORY_UPDATE_SUCCESS = "document.category.update.success"; + public static final String ERROR_MOVING_FILE_TO_DELETED_FOLDER = "error.moving.file.to.deleted.folder"; + + public static final String CATEGORY_CANNOT_BE_DELETED = "category.cannot.be.deleted"; + public static final String INVALID_EXPIRATION_DATE = "invalid.expiration.date"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java new file mode 100644 index 00000000..64357eec --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java @@ -0,0 +1,113 @@ +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.CategoryEntity; +import net.gepafin.tendermanagement.entities.CompanyDocumentEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.CategoryRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.repositories.CategoryRepository; +import net.gepafin.tendermanagement.repositories.CompanyDocumentRepository; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; +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.util.List; + +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class CategoryDao { + + @Autowired + private CategoryRepository categoryRepository; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private HttpServletRequest request; + + @Autowired + private CompanyDocumentRepository companyDocumentRepository; + + public CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest){ + + CategoryEntity entity = createCategoryEntity(new CategoryEntity(),categoryRequest); + categoryRepository.save(entity); + + /** This code is responsible for adding a version history log for the "Create Company Document Category" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build()); + + return convertToResponseBean(entity); + } + + public CategoryEntity createCategoryEntity(CategoryEntity entity,CategoryRequest companyDocumentCategoryRequest){ + entity.setCategoryName(companyDocumentCategoryRequest.getCategoryName()); + entity.setDescription(companyDocumentCategoryRequest.getDescription()); + entity.setIsDeleted(false); + return entity; + } + + public CategoryResponse convertToResponseBean(CategoryEntity entity){ + CategoryResponse response = new CategoryResponse(); + response.setId(entity.getId()); + response.setCategoryName(entity.getCategoryName()); + response.setDescription(entity.getDescription()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } + + public CategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id){ + return convertToResponseBean(validateCategory(id)); + } + + public CategoryEntity validateCategory(Long id) { + return categoryRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_NOT_FOUND))); + } + + public void deleteCategory(HttpServletRequest request,Long id) { + CategoryEntity entity = validateCategory(id); + + List companyDocumentEntities = companyDocumentRepository.findByCategoryEntityId(id); + if (!companyDocumentEntities.isEmpty()){ + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CATEGORY_CANNOT_BE_DELETED)); + } + CategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); + entity.setIsDeleted(true); + categoryRepository.save(entity); + + /** This code is responsible for adding a version history log for the "soft delete category" operation **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCategoryEntity).newData(entity).build()); + } + + public CategoryResponse updateCategory(HttpServletRequest request,Long id , CategoryRequest categoryRequest){ + CategoryEntity entity = validateCategory(id); + CategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); + CategoryEntity newCategoryEntity = updateCategoryEntity(entity, categoryRequest); + + /** This code is responsible for adding a version history log for the "Update Category" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCategoryEntity).newData(newCategoryEntity).build()); + return convertToResponseBean(entity); + } + + public CategoryEntity updateCategoryEntity(CategoryEntity entity , CategoryRequest categoryRequest){ + setIfUpdated(entity::getCategoryName, entity::setCategoryName, categoryRequest.getCategoryName()); + setIfUpdated(entity::getDescription, entity::setDescription, categoryRequest.getDescription()); + + return entity; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java new file mode 100644 index 00000000..e8c177d6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -0,0 +1,337 @@ +package net.gepafin.tendermanagement.dao; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.CopyObjectRequest; +import jakarta.persistence.criteria.Predicate; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.*; +import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; +import net.gepafin.tendermanagement.repositories.CompanyDocumentRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.CategoryService; +import net.gepafin.tendermanagement.service.CompanyService; +import net.gepafin.tendermanagement.service.impl.AmazonS3ServiceImpl; +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.beans.factory.annotation.Value; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Slf4j +@Component +public class CompanyDocumentDao { + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private AmazonS3Service amazonS3Service; + + @Autowired + private CompanyDocumentRepository companyDocumentRepository; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private HttpServletRequest request; + + @Autowired + private CategoryDao categoryDao; + + @Autowired + private CompanyService companyService; + + @Value("${aws.s3.bucket.name}") + private String bucketName; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private CallDao callDao; + + @Autowired + private ApplicationService applicationService; + + @Autowired + private AmazonS3ServiceImpl amazonS3ServiceImpl; + + @Autowired + private Validator validator; + + public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long categoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate){ + CategoryEntity categoryEntity = categoryDao.validateCategory(categoryId); + validator.validateUserWithCompany(request,companyId); + UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userId,companyId); + + LocalDateTime currentDate = LocalDateTime.now(); + if (expirationDate.isBefore(currentDate)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_EXPIRATION_DATE)); + } + List companyDocumentEntities = new ArrayList<>(); + for (MultipartFile file : files){ + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3(file, companyDocumentSourceTypeEnum, companyId); + if (uploadFileOnAmazonS3Response != null) { + CompanyDocumentEntity companyDocumentEntity = new CompanyDocumentEntity(); + companyDocumentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + companyDocumentEntity.setCompanyId(companyId); + companyDocumentEntity.setType(companyDocumentSourceTypeEnum.getValue()); + companyDocumentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); + companyDocumentEntity.setIsDeleted(false); + companyDocumentEntity.setUploadedBy(userId); + if (expirationDate.isBefore(currentDate.plusDays(7))) { + companyDocumentEntity.setStatus(CompanyDocumentStatusEnum.DUE.getValue()); + } else { + companyDocumentEntity.setStatus(CompanyDocumentStatusEnum.VALID.getValue()); + } + + companyDocumentEntity.setCategoryEntity(categoryEntity); + companyDocumentEntity.setUserWithCompany(userWithCompanyEntity); + companyDocumentEntity.setExpirationDate(expirationDate); + companyDocumentEntities.add(companyDocumentEntity); + } + } + companyDocumentRepository.saveAll(companyDocumentEntities); + + /** This code is responsible for adding a version history log for the "Upload company document" operation. **/ + + companyDocumentEntities.forEach(entity -> loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build())); + + return companyDocumentEntities.stream() + .map(this::convertToCompanyDocumentResponseBean) + .collect(Collectors.toList()); + + } + + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, CompanyDocumentTypeEnum type, Long companyId) { + try { + String s3Path = generateS3PathForCompany(type,companyId); + log.info("Generated S3 path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + + public String generateS3PathForCompany(CompanyDocumentTypeEnum typeOfDocument, Long companyId) { + try { + return s3ConfigBean.generateCompanyDocumentPath(typeOfDocument, companyId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } + + public CompanyDocumentEntity validateCompanyDocument(Long id) { + return companyDocumentRepository.findByIdAndNotDeleted(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_NOT_FOUND))); + } + + public CompanyDocumentResponseBean convertToCompanyDocumentResponseBean(CompanyDocumentEntity entity) { + CompanyDocumentResponseBean responseBean = new CompanyDocumentResponseBean(); + CategoryEntity categoryEntity = entity.getCategoryEntity(); + CategoryResponse responseCategory = categoryDao.convertToResponseBean(categoryEntity); + responseBean.setId(entity.getId()); + responseBean.setName(entity.getFileName()); + responseBean.setType(CompanyDocumentTypeEnum.valueOf(entity.getType())); + responseBean.setFilePath(entity.getFilePath()); + responseBean.setCompanyId(entity.getCompanyId()); + responseBean.setExpirationDate(entity.getExpirationDate()); + responseBean.setStatus(entity.getStatus()); + responseBean.setUploadedBy(entity.getUploadedBy()); + responseBean.setCategory(responseCategory); + responseBean.setUserWithCompanyId(entity.getUserWithCompany().getId()); + responseBean.setCreatedDate(entity.getCreatedDate()); + responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; + } + + public CompanyDocumentResponseBean updateCompanyDocument(HttpServletRequest request,Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest){ + + CompanyDocumentEntity companyDocumentEntity = validateCompanyDocument(companyDocumentId); + validator.validateUserWithCompany(request,companyDocumentEntity.getCompanyId()); + CompanyDocumentEntity oldCompanyDocumentData = Utils.getClonedEntityForData(companyDocumentEntity); + LocalDateTime currentDate = LocalDateTime.now(); + if (companyDocumentRequest.getExpirationDate() != null) { + if (companyDocumentRequest.getExpirationDate().isBefore(currentDate)) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_EXPIRATION_DATE)); + } + companyDocumentEntity.setExpirationDate(companyDocumentRequest.getExpirationDate()); + if (companyDocumentRequest.getExpirationDate().isBefore(currentDate.plusDays(7))) { + companyDocumentEntity.setStatus(CompanyDocumentStatusEnum.DUE.getValue()); + } else { + companyDocumentEntity.setStatus(CompanyDocumentStatusEnum.VALID.getValue()); + } + } + if (companyDocumentRequest.getCategoryId() != null && companyDocumentRequest.getCategoryId() >0) { + CategoryEntity categoryEntity = categoryDao.validateCategory(companyDocumentRequest.getCategoryId()); + setIfUpdated(companyDocumentEntity::getCategoryEntity, companyDocumentEntity::setCategoryEntity, categoryEntity); + } + companyDocumentRepository.save(companyDocumentEntity); + + /** This code is responsible for adding a version history log for the "updating company document" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyDocumentData).newData(companyDocumentEntity).build()); + + return convertToCompanyDocumentResponseBean(companyDocumentEntity); + } + + public CompanyDocumentResponseBean getCompanyDocument(UserEntity user ,Long companyDocumentId) { + CompanyDocumentEntity companyDocumentEntity = validateCompanyDocument(companyDocumentId); + validator.validateUserWithCompany(request,companyDocumentEntity.getCompanyId()); + return convertToCompanyDocumentResponseBean(companyDocumentEntity); + } + + public void deleteCompanyFile(Long companyDocumentId){ + CompanyDocumentEntity companyDocumentEntity = validateCompanyDocument(companyDocumentId); + deleteCompanyFileFromS3(companyDocumentEntity); + } + + public void deleteCompanyFileFromS3(CompanyDocumentEntity companyDocumentEntity){ + + try { + CompanyDocumentEntity oldCompanyDocumentEntity = Utils.getClonedEntityForData(companyDocumentEntity); + validator.validateUserWithCompany(request,companyDocumentEntity.getCompanyId()); + String oldCompanyDocumentPath = companyDocumentEntity.getFilePath(); + String newS3Path = s3ConfigBean.generateCompanyDocumentPathForOther(CompanyDocSourceTypeEnum.valueOf("DELETED_" + companyDocumentEntity.getType().toUpperCase()), companyDocumentEntity.getCompanyId()); + UploadFileOnAmazonS3Response response = amazonS3Service.moveFile(companyDocumentEntity.getFileName(), oldCompanyDocumentPath, newS3Path); + companyDocumentEntity.setFileName(response.getFileName()); + companyDocumentEntity.setFilePath(response.getFilePath()); + companyDocumentEntity.setIsDeleted(true); + companyDocumentRepository.save(companyDocumentEntity); + + /** This code is responsible for adding a version history log for the "Soft delete document" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCompanyDocumentEntity).newData(companyDocumentEntity).build()); + log.info("File for company document ID {} successfully moved to deleted folder.", companyDocumentEntity.getId()); + } + catch (Exception e) { + log.error("Error moving file for company document ID {} to deleted folder: {}", companyDocumentEntity.getId(), e.getMessage()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.ERROR_MOVING_FILE_TO_DELETED_FOLDER)); + } + } + + public UserActionContextEnum getUserActionContextEnum(CompanyDocumentTypeEnum type){ + UserActionContextEnum userActionContext = null; + if (type.equals(CompanyDocumentTypeEnum.COMPANY_DOCUMENT)){ + userActionContext = UserActionContextEnum.UPLOAD_COMPANY_DOCUMENT; + } + else if(type.equals(CompanyDocumentTypeEnum.PERSONAL_DOCUMENT)){ + userActionContext = UserActionContextEnum.UPLOAD_COMPANY_PERSONAL_DOCUMENT; + } + return userActionContext; + } + + public DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request , Long userId ,Long companyDocumentId , Long applicationId , DocumentTypeEnum documentTypeEnum){ + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); + CompanyDocumentEntity companyDocumentEntity = validateCompanyDocument(companyDocumentId); + validator.validateUserWithCompany(request,companyDocumentEntity.getCompanyId()); + + String oldS3Path = companyDocumentEntity.getFilePath(); + String newS3Path = s3ConfigBean.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION,applicationEntity.getCall().getId(),applicationId,0L); + + log.info("Original Paths - oldPath: {}, newPath: {}", oldS3Path, newS3Path); + + oldS3Path = amazonS3ServiceImpl.decodeS3Key(amazonS3ServiceImpl.cleanOldPath(oldS3Path)); + newS3Path = amazonS3ServiceImpl.cleanNewPath(oldS3Path, newS3Path); + log.info("Moving file from {} to {} in bucket {}", oldS3Path, newS3Path, bucketName); + + CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldS3Path, bucketName, newS3Path); + s3Client.copyObject(copyRequest); + log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); + + DocumentEntity entity = new DocumentEntity(); + entity.setFilePath(newS3Path); + entity.setFileName(companyDocumentEntity.getFileName()); + entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); + entity.setType(documentTypeEnum.getValue()); + entity.setSourceId(applicationId); + entity.setUploadedBy(userId); + + documentRepository.save(entity); + + /** This code is responsible for adding a version history log for the "inserting data" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build()); + + DocumentResponseBean responseBean = callDao.convertToDocumentResponseBean(entity); + return responseBean; + } + + public List getAllCompanyDocument(UserEntity user , Long companyId, CompanyDocumentTypeEnum typeEnum){ + validator.validateUserWithCompany(request, companyId); + companyService.validateCompany(companyId); + + Specification spec = filterCompanyDocuments(companyId, user.getId(), typeEnum); + + List companyDocumentEntities = companyDocumentRepository.findAll(spec); + return companyDocumentEntities.stream() + .map(this::convertToCompanyDocumentResponseBean) + .collect(Collectors.toList()); + + } + + private Specification filterCompanyDocuments(Long companyId, Long userId, CompanyDocumentTypeEnum typeEnum) { + return (root, query, builder) -> { + Predicate predicate = builder.equal(root.get("companyId"), companyId); + + if (typeEnum != null) { + if (typeEnum == CompanyDocumentTypeEnum.COMPANY_DOCUMENT) { + // Case 1: Fetch only COMPANY_DOCUMENT type documents for the given company + predicate = builder.and(predicate, builder.equal(root.get("type"), CompanyDocumentTypeEnum.COMPANY_DOCUMENT.getValue())); + + } else if (typeEnum == CompanyDocumentTypeEnum.PERSONAL_DOCUMENT) { + // Case 2: Fetch only PERSONAL_DOCUMENT type documents for the logged-in user + predicate = builder.and( + predicate, + builder.equal(root.get("type"), CompanyDocumentTypeEnum.PERSONAL_DOCUMENT.getValue()), + builder.equal(root.get("userWithCompany").get("userId"), userId) + ); + } + } + // Case 3: If typeEnum is null, fetch all documents for the company and personal documents for the user + Predicate companyPredicate = builder.equal(root.get("companyId"), companyId); + Predicate personalPredicate = builder.and( + builder.equal(root.get("type"), CompanyDocumentTypeEnum.PERSONAL_DOCUMENT.getValue()), + builder.equal(root.get("userWithCompany").get("userId"), userId) + ); + predicate = builder.and(predicate, builder.or(companyPredicate, personalPredicate)); + + return predicate; + }; + } + + + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index e1dbe853..81400797 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -316,7 +316,7 @@ public class DocumentDao { log.info("File for document ID {} successfully moved to deleted folder.", documentEntity.getId()); } catch (Exception e) { log.error("Error moving file for document ID {} to deleted folder: {}", documentEntity.getId(), e.getMessage()); - throw new CustomValidationException(Status.VALIDATION_ERROR, "Error occurred while moving file to deleted folder."); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.ERROR_MOVING_FILE_TO_DELETED_FOLDER)); } } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 275447ef..6494eb54 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -7,12 +7,7 @@ import jakarta.persistence.criteria.Root; import lombok.extern.slf4j.Slf4j; 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.NotificationEntity; -import net.gepafin.tendermanagement.entities.NotificationTypeEntity; -import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; +import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.NotificationEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; @@ -27,6 +22,7 @@ import net.gepafin.tendermanagement.repositories.NotificationTypeRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository; import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -80,6 +76,9 @@ public class NotificationDao { @Autowired private UserDao userDao; + @Autowired + private CompanyService companyService; + public NotificationResponse sendNotification(NotificationReq notificationReq) { // Ensure userId is properly set in notificationReq if not already @@ -414,4 +413,17 @@ public class NotificationDao { predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userId)); return predicates; } + + public void sendNotificationToBeneficiaryForDocumentExpiration(CompanyDocumentEntity companyDocumentEntity, NotificationTypeEnum notificationTypeEnum) { + + CompanyEntity companyEntity = companyService.validateCompany(companyDocumentEntity.getCompanyId()); + Map placeHolders = new HashMap<>(); + placeHolders.put("{{file_name}}", companyDocumentEntity.getFileName()); + placeHolders.put("{{company_name}}", companyEntity.getCompanyName()); + placeHolders.put("{{expiration_date}}", companyDocumentEntity.getExpirationDate().toString()); + NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, companyDocumentEntity.getUserWithCompany().getUserId(), companyDocumentEntity.getUserWithCompany(), + listOf(companyDocumentEntity.getCompanyId())); + sendNotification(notificationReq); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java index 1db01f11..9b55eda1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.enums.CompanyDocSourceTypeEnum; +import net.gepafin.tendermanagement.enums.CompanyDocumentTypeEnum; import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.repositories.S3ConfigRepository; @@ -49,4 +51,29 @@ public class S3PathConfig { public String getBucketNameForCallAppType(DocumentSourceTypeEnum type){ return s3ConfigRepository.getBucketNameByType(type); } + + public String generateCompanyDocumentPath(CompanyDocumentTypeEnum type, Long companyId) { + S3ConfigEntity config = getCompanyDocumentPath(type); + return config.getParentFolder() + "/" + buildCompanyDocumentS3Path(config.getPath(), companyId); + } + + private String buildCompanyDocumentS3Path(String pathTemplate, Long companyId) { + return pathTemplate + .replace("{company_id}", companyId != null && companyId != 0L ? "company_" + companyId : ""); + } + + private S3ConfigEntity getCompanyDocumentPath(CompanyDocumentTypeEnum type) { + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + + private S3ConfigEntity getCompanyDocumentPathForOther(CompanyDocSourceTypeEnum type) { + + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + + public String generateCompanyDocumentPathForOther(CompanyDocSourceTypeEnum type, Long companyId) { + + S3ConfigEntity config = getCompanyDocumentPathForOther(type); + return config.getParentFolder() + "/" + buildCompanyDocumentS3Path(config.getPath(),companyId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java new file mode 100644 index 00000000..9ebd2de7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "category") +@Data +public class CategoryEntity extends BaseEntity { + + @Column(name = "CATEGORY_NAME") + private String categoryName; + + @Column(name = "DESCRIPTION") + private String description; + + @Column(name ="IS_DELETED") + private Boolean isDeleted = false; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java new file mode 100644 index 00000000..03d16e67 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java @@ -0,0 +1,46 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "COMPANY_DOCUMENT") +@Data +public class CompanyDocumentEntity extends BaseEntity { + + @Column(name = "FILE_NAME") + private String fileName; + + @Column(name = "FILE_PATH") + private String filePath; + + @Column(name="TYPE") + private String type; + + @Column(name="COMPANY_ID") + private Long companyId; + + @Column(name ="IS_DELETED") + private Boolean isDeleted = false; + + @Column(name="UPLOADED_BY") + private Long uploadedBy; + + @Column(name = "EXPIRATION_DATE") + private LocalDateTime expirationDate; + + @Column(name ="STATUS") + private String status; + + @ManyToOne + @JoinColumn(name = "USER_WITH_COMPANY_ID") + private UserWithCompanyEntity userWithCompany; + + @ManyToOne + @JoinColumn(name = "CATEGORY_ID") + private CategoryEntity categoryEntity; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocSourceTypeEnum.java new file mode 100644 index 00000000..bb78960c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocSourceTypeEnum.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.enums; + + +public enum CompanyDocSourceTypeEnum { + + DELETED_PERSONAL_DOCUMENT("DELETED_PERSONAL_DOCUMENT"), + DELETED_COMPANY_DOCUMENT("DELETED_COMPANY_DOCUMENT"); + + + private String value; + + CompanyDocSourceTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentStatusEnum.java new file mode 100644 index 00000000..b3a1782f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentStatusEnum.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.enums; + +public enum CompanyDocumentStatusEnum { + VALID("VALID"), + DUE("DUE"), + EXPIRED("EXPIRED"); + + private String value; + + CompanyDocumentStatusEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentTypeEnum.java new file mode 100644 index 00000000..9b163da0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/CompanyDocumentTypeEnum.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.enums; + +public enum CompanyDocumentTypeEnum { + COMPANY_DOCUMENT("COMPANY_DOCUMENT"), + PERSONAL_DOCUMENT("PERSONAL_DOCUMENT"); + + private String value; + + CompanyDocumentTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ExpirationTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ExpirationTypeEnum.java index 2aaa1ae2..91ebfc25 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ExpirationTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ExpirationTypeEnum.java @@ -5,7 +5,8 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum ExpirationTypeEnum { AMENDMENT("AMENDMENT"), - EVALUATION("EVALUATION"); + EVALUATION("EVALUATION"), + COMPANY_DOCUMENT("COMPANY_DOCUMENT"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java index 96d89e91..8957c03b 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/NotificationTypeEnum.java @@ -13,7 +13,8 @@ public enum NotificationTypeEnum { EVALUATION_CREATION("EVALUATION_CREATION"), EVALUATION_EXPIRED("EVALUATION_EXPIRED"), AMENDMENT_EXPIRATION_REMINDER("AMENDMENT_EXPIRATION_REMINDER"), - EVALUATION_EXPIRATION_REMINDER("EVALUATION_EXPIRATION_REMINDER"); + EVALUATION_EXPIRATION_REMINDER("EVALUATION_EXPIRATION_REMINDER"), + COMPANY_DOCUMENT_EXPIRATION_REMINDER("COMPANY_DOCUMENT_EXPIRATION_REMINDER"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 25a056ae..08f50f03 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -192,7 +192,21 @@ public enum UserActionContextEnum { GET_USER_ACTION("GET_USER_ACTION"), - GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"); + GET_ACTION_CONTEXT_LABELS("GET_ACTION_CONTEXT_LABELS"), + + GET_COMPANY_DOCUMENT("GET_COMPANY_DOCUMENT"), + DELETE_COMPANY_DOCUMENT("DELETE_COMPANY_DOCUMENT"), + UPLOAD_COMPANY_DOCUMENT("UPLOAD_COMPANY_DOCUMENT"), + UPLOAD_COMPANY_PERSONAL_DOCUMENT("UPLOAD_COMPANY_PERSONAL_DOCUMENT"), + GET_ALL_COMPANY_DOCUMENT("GET_ALL_COMPANY_DOCUMENT"), + UPDATE_COMPANY_DOCUMENT("UPDATE_COMPANY_DOCUMENT"), + DUPLICATE_COMPANY_DOCUMENT("DUPLICATE_COMPANY_DOCUMENT"), + + CREATE_DOCUMENT_CATEGORY("CREATE_DOCUMENT_CATEGORY"), + GET_DOCUMENT_CATEGORY("GET_DOCUMENT_CATEGORY"), + DELETE_DOCUMENT_CATEGORY("DELETE_DOCUMENT_CATEGORY"), + UPDATE_DOCUMENT_CATEGORY("UPDATE_DOCUMENT_CATEGORY"), + COMPANY_DOCUMENT_EXPIRATION_SCHEDULER("COMPANY_DOCUMENT_EXPIRATION_SCHEDULER"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java new file mode 100644 index 00000000..2512d80d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class CategoryRequest { + private String categoryName; + private String description; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java new file mode 100644 index 00000000..41d167ca --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.time.LocalDateTime; + + +@Data +public class CompanyDocumentRequest { + private Long categoryId; + private LocalDateTime expirationDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java new file mode 100644 index 00000000..3eb8858b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class CategoryResponse extends BaseBean { + private String categoryName; + private String description; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java new file mode 100644 index 00000000..e5765996 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CompanyDocumentTypeEnum; +import net.gepafin.tendermanagement.model.BaseBean; +import java.time.LocalDateTime; + +@Data +public class CompanyDocumentResponseBean extends BaseBean { + + private String name; + + private String filePath; + + private CompanyDocumentTypeEnum type; + + private Long companyId; + + private String status; + + private LocalDateTime expirationDate; + + private Long uploadedBy; + + private Long userWithCompanyId; + + private CategoryResponse category; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java new file mode 100644 index 00000000..2253c5be --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.CategoryEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CategoryRepository extends JpaRepository { +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyDocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyDocumentRepository.java new file mode 100644 index 00000000..30a49410 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyDocumentRepository.java @@ -0,0 +1,41 @@ +package net.gepafin.tendermanagement.repositories; + +import feign.Param; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.CompanyDocumentEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Repository +public interface CompanyDocumentRepository extends JpaRepository, JpaSpecificationExecutor { + + @Query("SELECT c FROM CompanyDocumentEntity c WHERE c.id = :id AND c.isDeleted = false") + Optional findByIdAndNotDeleted(@Param("id") Long id); + + @Query("SELECT d FROM CompanyDocumentEntity d " + + "WHERE d.isDeleted = false " + + "AND d.expirationDate BETWEEN :startTime AND :endTime") + List findExpiringBetween(LocalDateTime startTime, LocalDateTime endTime); + + @Query("SELECT c FROM CompanyDocumentEntity c " + + "WHERE c.isDeleted = false " + + "AND c.expirationDate < :now") + List findByExpirationDateBeforeAndIsDeletedFalse(LocalDateTime now); + + @Query("SELECT c FROM CompanyDocumentEntity c " + + "WHERE c.companyId = :companyId " + + "AND c.isDeleted = false") + List findByCompanyId(Long companyId); + + List findByCategoryEntityId(Long categoryId); + + + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/CompanyDocumentExpirationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/CompanyDocumentExpirationScheduler.java new file mode 100644 index 00000000..e5a40408 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/CompanyDocumentExpirationScheduler.java @@ -0,0 +1,113 @@ +package net.gepafin.tendermanagement.scheduler; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.NotificationDao; +import net.gepafin.tendermanagement.entities.CompanyDocumentEntity; +import net.gepafin.tendermanagement.entities.ExpirationConfigEntity; +import net.gepafin.tendermanagement.enums.*; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.CompanyDocumentRepository; +import net.gepafin.tendermanagement.repositories.ExpirationConfigRepository; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +public class CompanyDocumentExpirationScheduler { + + @Autowired + private CompanyDocumentRepository companyDocumentRepository; + + @Autowired + private NotificationDao notificationDao; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private HttpServletRequest request; + + @Autowired + private ExpirationConfigRepository expirationConfigRepository; + + private static final Logger log = LoggerFactory.getLogger(ExpirationScheduler.class); + + @Scheduled(cron = "0 0 4 * * ?") + public void processDocumentExpiration(){ + log.info("Starting the Document Expiration scheduler..."); + + try { + Utils.setHttpServletRequestForScheduler(); + + // Logging user action for the scheduler operation + loggingUtil.logUserActionWithoutToken( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.SCHEDULER) + .actionContext(UserActionContextEnum.COMPANY_DOCUMENT_EXPIRATION_SCHEDULER).build()); + + + log.info("Starting processing expiration notifications for document"); + processExpirationReminder(ExpirationTypeEnum.COMPANY_DOCUMENT); + updateExpiredDocuments(); + + log.info("Expiration scheduler completed successfully."); + } + catch (Exception e){ + log.error("An error occurred during the Notification Expiration Scheduler of Document: {}", e.getMessage(), e); + } + } + + private void processExpirationReminder(ExpirationTypeEnum typeEnum){ + List configEntities = expirationConfigRepository.findByTypeAndIsDeletedFalse(typeEnum.getValue()); + + for (ExpirationConfigEntity config : configEntities){ + Long daysBefore = config.getIntervalDays(); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startDate = now.plusDays(daysBefore).withHour(0).withMinute(0).withSecond(0).withNano(2); + LocalDateTime endDate = startDate.plusDays(1).minusNanos(2); + + processDocumentExpiration(startDate, endDate, daysBefore); + } + } + + private void processDocumentExpiration(LocalDateTime startDate, LocalDateTime endDate, Long daysBefore){ + List expiringDocuments = companyDocumentRepository.findExpiringBetween(startDate, endDate); + + for (CompanyDocumentEntity document : expiringDocuments) { + notificationDao.sendNotificationToBeneficiaryForDocumentExpiration(document, NotificationTypeEnum.COMPANY_DOCUMENT_EXPIRATION_REMINDER); + updateDocumentStatus(document, CompanyDocumentStatusEnum.DUE.getValue()); + } + } + + + private void updateDocumentStatus(CompanyDocumentEntity companyDocument,String status) { + CompanyDocumentEntity oldCompanyDocumentEntity = Utils.getClonedEntityForData(companyDocument); + companyDocument.setStatus(status); + companyDocumentRepository.save(companyDocument); + + // Logging version history for the update operation + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request) + .actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyDocumentEntity) + .newData(companyDocument).build()); + + log.info("Updated document status for document: {}", companyDocument.getFileName()); + } + + + private void updateExpiredDocuments() { + LocalDateTime now = LocalDateTime.now(); + List expiredDocuments = companyDocumentRepository.findByExpirationDateBeforeAndIsDeletedFalse(now); + + for (CompanyDocumentEntity document : expiredDocuments) { + updateDocumentStatus(document, CompanyDocumentStatusEnum.EXPIRED.getValue()); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java b/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java new file mode 100644 index 00000000..f0c8e35b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.CategoryRequest; +import net.gepafin.tendermanagement.model.response.CategoryResponse; + +public interface CategoryService { + + CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest); + CategoryResponse getDocumentCategoryById(HttpServletRequest request,Long id); + void deleteCategory(HttpServletRequest request,Long id); + CategoryResponse updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java new file mode 100644 index 00000000..b4ffdd10 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.CompanyDocumentTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; +import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.List; + +public interface CompanyDocumentService { + List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long categoryId, CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate); + + CompanyDocumentResponseBean updateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest); + + CompanyDocumentResponseBean getCompanyDocument(HttpServletRequest request, Long companyDocumentId); + + void deleteCompanyFile(HttpServletRequest request,Long companyDocumentId); + + DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum); + + List getAllCompanyDocument(HttpServletRequest request ,Long companyId , CompanyDocumentTypeEnum typeEnum); + + + +} 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 9909f732..bff95344 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -153,7 +153,7 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } } - private String decodeS3Key(String key) { + public String decodeS3Key(String key) { return URLDecoder.decode(key, StandardCharsets.UTF_8); } @@ -186,11 +186,11 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } } - private String cleanNewPath(String oldPath, String newPath) { + public String cleanNewPath(String oldPath, String newPath) { return newPath + "/" + oldPath.substring(oldPath.lastIndexOf("/") + 1); } - private String cleanOldPath(String oldPath) { + public String cleanOldPath(String oldPath) { return oldPath.replace(s3Url, ""); } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java new file mode 100644 index 00000000..bd175b44 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java @@ -0,0 +1,51 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.CategoryDao; +import net.gepafin.tendermanagement.model.request.CategoryRequest; +import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.service.CategoryService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class CategoryServiceImpl implements CategoryService { + + @Autowired + CategoryDao categoryDao; + + @Autowired + private Validator validator; + + @Override + @Transactional(rollbackFor = Exception.class) + public CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest) { + validator.validateUser(request); + return categoryDao.createDocumentCategory(request,categoryRequest); + } + + @Override + @Transactional(readOnly = true) + public CategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id) { + validator.validateUser(request); + return categoryDao.getDocumentCategoryById(request,id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCategory(HttpServletRequest request, Long id) { + validator.validateUser(request); + categoryDao.deleteCategory(request,id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public CategoryResponse updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest) { + validator.validateUser(request); + return categoryDao.updateCategory(request,id,categoryRequest); + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java new file mode 100644 index 00000000..3cd1cdba --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.CompanyDocumentDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.CompanyDocumentTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; +import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.service.CompanyDocumentService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Service +public class CompanyDocumentServiceImpl implements CompanyDocumentService { + + @Autowired + private Validator validator; + + @Autowired + private CompanyDocumentDao companyDocumentDao; + + @Override + public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long categoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate) { + Map userInfo = validator.getUserInfoFromToken(request); + Long userId = validator.getUserId(userInfo); + return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,categoryId,documentSourceTypeEnum,expirationDate); + } + + @Override + public CompanyDocumentResponseBean updateCompanyDocument(HttpServletRequest request, Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest) { + validator.validateUser(request); + return companyDocumentDao.updateCompanyDocument(request,companyDocumentId, companyDocumentRequest); + } + + @Override + public CompanyDocumentResponseBean getCompanyDocument(HttpServletRequest request, Long companyDocumentId) { + UserEntity user = validator.validateUser(request); + return companyDocumentDao.getCompanyDocument(user , companyDocumentId); + } + + @Override + public void deleteCompanyFile(HttpServletRequest request,Long companyDocumentId) { + validator.validateUser(request); + companyDocumentDao.deleteCompanyFile(companyDocumentId); + } + + @Override + public DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum) { + UserEntity user = validator.validateUser(request); + return companyDocumentDao.validateAndDuplicateCompanyDocument(request, user.getId(), companyDocumentId,applicationId,typeEnum); + } + + @Override + public List getAllCompanyDocument(HttpServletRequest request, Long companyId, CompanyDocumentTypeEnum typeEnum) { + UserEntity user = validator.validateUser(request); + return companyDocumentDao.getAllCompanyDocument(user,companyId,typeEnum); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java new file mode 100644 index 00000000..4e3495f2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java @@ -0,0 +1,85 @@ +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.CategoryRequest; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +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.*; + +@Validated +public interface CategoryApi { + + @Operation(summary = "Api to create document category", 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 = "", produces = "application/json") + ResponseEntity> createDocumentCategory(HttpServletRequest request, + @Parameter(description = "Company Document Category request object", required = true) + @Valid @RequestBody CategoryRequest categoryRequest); + + + @Operation(summary = "Api to get document category 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 = "/{id}", produces = "application/json") + ResponseEntity> getDocumentCategoryById(HttpServletRequest request, + @Parameter(description = "The category id", required = true) + @PathVariable("id") Long id); + + + @Operation(summary = "Api to delete a document category", 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 = "/{id}") + ResponseEntity> deleteCategory(HttpServletRequest request, + @Parameter(description = "The category id", required = true) + @PathVariable("id") Long id); + + + @Operation(summary = "API to update a document category", 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}", produces = "application/json") + ResponseEntity> updateCategory(HttpServletRequest request, + @Parameter(description = "The category id", required = true) + @PathVariable("id") Long id, + @Parameter(description = "Category request object", required = true) + @Valid @RequestBody CategoryRequest categoryRequest); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java new file mode 100644 index 00000000..cfa523af --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java @@ -0,0 +1,122 @@ +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.enums.CompanyDocumentTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; +import net.gepafin.tendermanagement.model.request.FormRequest; +import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.List; + +@Validated +public interface CompanyDocumentApi { + @Operation(summary = "Api to upload a file for company", + 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 = "/company/{companyId}/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + default ResponseEntity>> uploadFileForCompany(HttpServletRequest httpServletRequest, + @Parameter(description = "Company Id", required = true) @PathVariable("companyId") Long companyId, + @Parameter(description = "The Category id", required = true) @RequestParam(value = "categoryId", required = false) Long categoryId, + @RequestParam("documentType") CompanyDocumentTypeEnum documentTypeEnum, + @RequestParam("expirationDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime expirationDate, + @RequestParam("file") List files) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "Api to update company document", + 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}",produces = "application/json") + default ResponseEntity> updateCompanyDocument(HttpServletRequest httpServletRequest, @Parameter(description = "Company Document Id", required = true) @PathVariable("id") Long companyDocumentId,@Valid @RequestBody CompanyDocumentRequest companyDocumentRequest) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "API to get company document 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) })) + }) + @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getCompanyDocumentById(HttpServletRequest request, + @Parameter(description = "Company Document Id", required = true) + @PathVariable("id") Long id); + + @Operation(summary = "API to delete a file by company document id", + responses = { + @ApiResponse(responseCode = "200", description = "File deleted successfully"), + @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 = "") + default ResponseEntity> deleteCompanyFile(HttpServletRequest httpServletRequest, + @RequestParam( "id") Long id) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + + @Operation(summary = "Api to copy a company document", + 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}/document/upload", produces = MediaType.APPLICATION_JSON_VALUE) + default ResponseEntity> validateAndDuplicateCompanyDocument (HttpServletRequest httpServletRequest, @Parameter(description = "Company Document Id", required = true) @PathVariable("id") Long companyDocumentId, + @Parameter(description = "Application Id", required = true) @RequestParam Long applicationId, + @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @Operation(summary = "API to get all company documents", + 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) })) + }) + @GetMapping(value = "/company/{companyId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity>> getAllCompanyDocuments(HttpServletRequest request, + @Parameter(description = "Company Id", required = true) + @PathVariable("companyId") Long companyId , @RequestParam(value = "documentType", required = false) CompanyDocumentTypeEnum documentTypeEnum); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java new file mode 100644 index 00000000..42f92121 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java @@ -0,0 +1,83 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +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.CategoryRequest; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.CategoryService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.CategoryApi; +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/category}") +public class CategoryApiController implements CategoryApi { + + @Autowired + LoggingUtil loggingUtil; + + @Autowired + CategoryService categoryService; + + public ResponseEntity> createDocumentCategory(HttpServletRequest request, @Valid CategoryRequest categoryRequest){ + + /** This code is responsible for creating user action logs for the "Create Document category" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT) + .actionContext(UserActionContextEnum.CREATE_DOCUMENT_CATEGORY).build()); + + CategoryResponse categoryResponse = categoryService.createDocumentCategory(request,categoryRequest); + + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_CREATE_SUCCESS))); + + } + + @Override + public ResponseEntity> getDocumentCategoryById(HttpServletRequest request, Long id) { + + /** This code is responsible for creating user action logs for the "get document category by id" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_DOCUMENT_CATEGORY).build()); + + CategoryResponse categoryResponse = categoryService.getDocumentCategoryById(request,id); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_GET_SUCCESS))); + } + + @Override + public ResponseEntity> deleteCategory(HttpServletRequest request, Long id) { + + /** This code is responsible for creating user action logs for the "Delete category" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_DOCUMENT_CATEGORY).build()); + + categoryService.deleteCategory(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_DELETE_SUCCESS))); + } + + @Override + public ResponseEntity> updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest) { + + /** This code is responsible for "Updating Category details" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_DOCUMENT_CATEGORY).build()); + + CategoryResponse categoryResponse = categoryService.updateCategory(request,id, categoryRequest); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_UPDATE_SUCCESS))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java new file mode 100644 index 00000000..df55fb19 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java @@ -0,0 +1,118 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.CompanyDocumentDao; +import net.gepafin.tendermanagement.enums.*; +import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.CompanyDocumentService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.CompanyDocumentApi; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +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 org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/companyDocument}") +@Slf4j +public class CompanyDocumentApiControlller implements CompanyDocumentApi { + + @Autowired + private CompanyDocumentService companyDocumentService; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private CompanyDocumentDao companyDocumentDao; + + @Override + public ResponseEntity>> uploadFileForCompany(HttpServletRequest request, Long companyId, Long categoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate, + List files) { + try { + UserActionContextEnum userActionContext = companyDocumentDao.getUserActionContextEnum(companyDocumentSourceTypeEnum); + + /** This code is responsible for creating user action logs for the "upload document for company" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(userActionContext).build()); + + List responseBeans = companyDocumentService.uploadFileForCompany(request,files, companyId, categoryId ,companyDocumentSourceTypeEnum,expirationDate); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); + } catch (CustomValidationException ex) { + throw ex; + } + } + + + @Override + public ResponseEntity> updateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest) { + + /** This code is responsible for creating user action logs for the "update company document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_COMPANY_DOCUMENT).build()); + + CompanyDocumentResponseBean responseBeans = companyDocumentService.updateCompanyDocument(httpServletRequest, companyDocumentId, companyDocumentRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_UPDATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getCompanyDocumentById(HttpServletRequest request, Long id) { + /** This code is responsible for creating user action logs for the "Get Company Document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_COMPANY_DOCUMENT).build()); + + CompanyDocumentResponseBean companyDocumentResponseBean = companyDocumentService.getCompanyDocument(request, id); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(companyDocumentResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteCompanyFile(HttpServletRequest request, Long companyDocumentId) { + + /** This code is responsible for creating user action logs for the "delete company document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_COMPANY_DOCUMENT).build()); + + companyDocumentService.deleteCompanyFile(request,companyDocumentId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG))); + } + + @Override + public ResponseEntity> validateAndDuplicateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId , Long applicationId,DocumentTypeEnum typeEnum) { + + /** This code is responsible for creating user action logs for the "duplicate company document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.DUPLICATE_COMPANY_DOCUMENT).build()); + + DocumentResponseBean responseBeans = companyDocumentService.validateAndDuplicateCompanyDocument(httpServletRequest, companyDocumentId,applicationId,typeEnum); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_COPIED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity>> getAllCompanyDocuments(HttpServletRequest request, Long companyId, CompanyDocumentTypeEnum typeEnum) { + log.info("Get All Company Document"); + + /** This code is responsible for creating user action logs for the "get all Company Document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_COMPANY_DOCUMENT).build()); + + List companyDocumentResponseBeans = companyDocumentService.getAllCompanyDocument(request,companyId,typeEnum); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(companyDocumentResponseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_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 37c34586..843d052b 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 @@ -2418,4 +2418,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/updated_expiration_scheduler_data_24_02_2025.sql b/src/main/resources/db/dump/updated_expiration_scheduler_data_24_02_2025.sql new file mode 100644 index 00000000..949f0b61 --- /dev/null +++ b/src/main/resources/db/dump/updated_expiration_scheduler_data_24_02_2025.sql @@ -0,0 +1,3 @@ +INSERT INTO expiration_config (interval_days, type, created_date, updated_date) +VALUES +(7, 'COMPANY_DOCUMENT', '2025-02-24T11:00:51', '2025-02-24T11:00:51'); \ No newline at end of file diff --git a/src/main/resources/db/dump/updated_json_template_for_notification_24_02_2025.sql b/src/main/resources/db/dump/updated_json_template_for_notification_24_02_2025.sql new file mode 100644 index 00000000..14d9e262 --- /dev/null +++ b/src/main/resources/db/dump/updated_json_template_for_notification_24_02_2025.sql @@ -0,0 +1,2 @@ +INSERT INTO notification_type (notification_name,title, json_template,created_date,updated_date,is_deleted) VALUES +('COMPANY_DOCUMENT_EXPIRATION_REMINDER','Il documento sta per scadere','Il documento "{{file_name}}" per lazienda "{{company_name}}" scadrà il {{expiration_date}}. Assicurati di rinnovarlo o sostituirlo prima della scadenza.','2025-02-24T10:16:26.472Z','2025-02-24T10:16:26.472Z','false'); \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7aab6f08..8b13c186 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -371,4 +371,17 @@ validation.required.requested.amount=The Requested Amount configuration should b company.id.not.null=Company ID cannot be null. formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. +document.category.update.success = Document Category updated successfully. +document.category.delete.success = Document Category deleted successfully. +document.category.get.success = Document Category fetched successfully. +document.category.success = Document Category created successfully. +document.category.not.found = Document Category not found. +error.moving.file.to.deleted.folder = Error occurred while moving company file to deleted folder. + +company.document.fetched.successfully = Company Document fetched successfully. +company.document.updated.successfully = Company Document Updated successfully. +category.cannot.be.deleted = Category cannot be deleted as it is associated with company documents. +company.document.copied.successfully = Company Document Copied successfully. +invalid.expiration.date = Invalid Expiration Date + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c1794a8d..5d8dff82 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -362,4 +362,17 @@ validation.required.requested.amount=La configurazione dell'importo richiesto company.id.not.null=L'ID dell'azienda non pu? essere nullo. formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. +document.category.update.success = Categoria documento aggiornata correttamente. +document.category.delete.success = Categoria documento eliminata correttamente. +document.category.not.found = Categoria documento non trovata. +document.category.get.success = Categoria del documento recuperata correttamente. +document.category.success =Categoria documento creata correttamente. +company.document.copied.successfully = Documento aziendale copiato correttamente. +error.moving.file.to.deleted.folder = Si è verificato un errore durante lo spostamento del file aziendale nella cartella eliminata.ss + +company.document.fetched.successfully = Documento aziendale recuperato con successo. +company.document.updated.successfully = Documento aziendale aggiornato con successo. +category.cannot.be.deleted = La categoria non può essere eliminata perché è associata a documenti aziendali. +invalid.expiration.date = Data di scadenza non valida + From 46e603af3ecd8bb5782bedcdcfb53b3b5b644257 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 25 Feb 2025 13:42:38 +0530 Subject: [PATCH 28/50] updated code --- .../dao/CompanyDocumentDao.java | 17 +++---- ...egoryDao.java => DocumentCategoryDao.java} | 44 +++++++++---------- .../entities/CompanyDocumentEntity.java | 4 +- ...ntity.java => DocumentCategoryEntity.java} | 4 +- .../enums/UserActionContextEnum.java | 3 +- ...uest.java => DocumentCategoryRequest.java} | 2 +- .../response/CompanyDocumentResponseBean.java | 2 +- ...nse.java => DocumentCategoryResponse.java} | 2 +- ...y.java => DocumentCategoryRepository.java} | 4 +- .../service/CategoryService.java | 13 ------ .../service/CompanyDocumentService.java | 2 +- .../service/DocumentCategoryService.java | 13 ++++++ .../impl/CompanyDocumentServiceImpl.java | 4 +- ....java => DocumentCategoryServiceImpl.java} | 24 +++++----- .../web/rest/api/CompanyDocumentApi.java | 2 +- ...egoryApi.java => DocumentCategoryApi.java} | 31 ++++++------- .../impl/CompanyDocumentApiControlller.java | 4 +- ...ava => DocumentCategoryApiController.java} | 31 +++++++------ .../db/changelog/db.changelog-1.0.0.xml | 9 ++-- 19 files changed, 104 insertions(+), 111 deletions(-) rename src/main/java/net/gepafin/tendermanagement/dao/{CategoryDao.java => DocumentCategoryDao.java} (67%) rename src/main/java/net/gepafin/tendermanagement/entities/{CategoryEntity.java => DocumentCategoryEntity.java} (81%) rename src/main/java/net/gepafin/tendermanagement/model/request/{CategoryRequest.java => DocumentCategoryRequest.java} (79%) rename src/main/java/net/gepafin/tendermanagement/model/response/{CategoryResponse.java => DocumentCategoryResponse.java} (77%) rename src/main/java/net/gepafin/tendermanagement/repositories/{CategoryRepository.java => DocumentCategoryRepository.java} (51%) delete mode 100644 src/main/java/net/gepafin/tendermanagement/service/CategoryService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java rename src/main/java/net/gepafin/tendermanagement/service/impl/{CategoryServiceImpl.java => DocumentCategoryServiceImpl.java} (50%) rename src/main/java/net/gepafin/tendermanagement/web/rest/api/{CategoryApi.java => DocumentCategoryApi.java} (79%) rename src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/{CategoryApiController.java => DocumentCategoryApiController.java} (68%) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index e8c177d6..a9f45b86 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -11,7 +11,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.response.CategoryResponse; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; @@ -19,7 +19,6 @@ import net.gepafin.tendermanagement.repositories.CompanyDocumentRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.CategoryService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.impl.AmazonS3ServiceImpl; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -34,8 +33,6 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -63,7 +60,7 @@ public class CompanyDocumentDao { private HttpServletRequest request; @Autowired - private CategoryDao categoryDao; + private DocumentCategoryDao categoryDao; @Autowired private CompanyService companyService; @@ -89,8 +86,8 @@ public class CompanyDocumentDao { @Autowired private Validator validator; - public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long categoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate){ - CategoryEntity categoryEntity = categoryDao.validateCategory(categoryId); + public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate){ + DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId); validator.validateUserWithCompany(request,companyId); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userId,companyId); @@ -159,8 +156,8 @@ public class CompanyDocumentDao { public CompanyDocumentResponseBean convertToCompanyDocumentResponseBean(CompanyDocumentEntity entity) { CompanyDocumentResponseBean responseBean = new CompanyDocumentResponseBean(); - CategoryEntity categoryEntity = entity.getCategoryEntity(); - CategoryResponse responseCategory = categoryDao.convertToResponseBean(categoryEntity); + DocumentCategoryEntity categoryEntity = entity.getCategoryEntity(); + DocumentCategoryResponse responseCategory = categoryDao.convertToResponseBean(categoryEntity); responseBean.setId(entity.getId()); responseBean.setName(entity.getFileName()); responseBean.setType(CompanyDocumentTypeEnum.valueOf(entity.getType())); @@ -194,7 +191,7 @@ public class CompanyDocumentDao { } } if (companyDocumentRequest.getCategoryId() != null && companyDocumentRequest.getCategoryId() >0) { - CategoryEntity categoryEntity = categoryDao.validateCategory(companyDocumentRequest.getCategoryId()); + DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(companyDocumentRequest.getCategoryId()); setIfUpdated(companyDocumentEntity::getCategoryEntity, companyDocumentEntity::setCategoryEntity, categoryEntity); } companyDocumentRepository.save(companyDocumentEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java similarity index 67% rename from src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java rename to src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java index 64357eec..5dc799fb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CategoryDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java @@ -3,15 +3,13 @@ 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.CategoryEntity; +import net.gepafin.tendermanagement.entities.DocumentCategoryEntity; import net.gepafin.tendermanagement.entities.CompanyDocumentEntity; -import net.gepafin.tendermanagement.entities.FaqEntity; -import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; -import net.gepafin.tendermanagement.model.request.CategoryRequest; +import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.response.CategoryResponse; -import net.gepafin.tendermanagement.repositories.CategoryRepository; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; +import net.gepafin.tendermanagement.repositories.DocumentCategoryRepository; import net.gepafin.tendermanagement.repositories.CompanyDocumentRepository; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; @@ -26,10 +24,10 @@ import java.util.List; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component -public class CategoryDao { +public class DocumentCategoryDao { @Autowired - private CategoryRepository categoryRepository; + private DocumentCategoryRepository categoryRepository; @Autowired private LoggingUtil loggingUtil; @@ -40,9 +38,9 @@ public class CategoryDao { @Autowired private CompanyDocumentRepository companyDocumentRepository; - public CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest){ + public DocumentCategoryResponse createDocumentCategory(HttpServletRequest request, DocumentCategoryRequest categoryRequest){ - CategoryEntity entity = createCategoryEntity(new CategoryEntity(),categoryRequest); + DocumentCategoryEntity entity = createCategoryEntity(new DocumentCategoryEntity(),categoryRequest); categoryRepository.save(entity); /** This code is responsible for adding a version history log for the "Create Company Document Category" operation. **/ @@ -51,15 +49,15 @@ public class CategoryDao { return convertToResponseBean(entity); } - public CategoryEntity createCategoryEntity(CategoryEntity entity,CategoryRequest companyDocumentCategoryRequest){ + public DocumentCategoryEntity createCategoryEntity(DocumentCategoryEntity entity, DocumentCategoryRequest companyDocumentCategoryRequest){ entity.setCategoryName(companyDocumentCategoryRequest.getCategoryName()); entity.setDescription(companyDocumentCategoryRequest.getDescription()); entity.setIsDeleted(false); return entity; } - public CategoryResponse convertToResponseBean(CategoryEntity entity){ - CategoryResponse response = new CategoryResponse(); + public DocumentCategoryResponse convertToResponseBean(DocumentCategoryEntity entity){ + DocumentCategoryResponse response = new DocumentCategoryResponse(); response.setId(entity.getId()); response.setCategoryName(entity.getCategoryName()); response.setDescription(entity.getDescription()); @@ -68,24 +66,24 @@ public class CategoryDao { return response; } - public CategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id){ + public DocumentCategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id){ return convertToResponseBean(validateCategory(id)); } - public CategoryEntity validateCategory(Long id) { + public DocumentCategoryEntity validateCategory(Long id) { return categoryRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_NOT_FOUND))); } - public void deleteCategory(HttpServletRequest request,Long id) { - CategoryEntity entity = validateCategory(id); + public void deleteDocumentCategory(HttpServletRequest request,Long id) { + DocumentCategoryEntity entity = validateCategory(id); List companyDocumentEntities = companyDocumentRepository.findByCategoryEntityId(id); if (!companyDocumentEntities.isEmpty()){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CATEGORY_CANNOT_BE_DELETED)); } - CategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); + DocumentCategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); entity.setIsDeleted(true); categoryRepository.save(entity); @@ -94,17 +92,17 @@ public class CategoryDao { VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCategoryEntity).newData(entity).build()); } - public CategoryResponse updateCategory(HttpServletRequest request,Long id , CategoryRequest categoryRequest){ - CategoryEntity entity = validateCategory(id); - CategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); - CategoryEntity newCategoryEntity = updateCategoryEntity(entity, categoryRequest); + public DocumentCategoryResponse updateDocumentCategory(HttpServletRequest request, Long id , DocumentCategoryRequest categoryRequest){ + DocumentCategoryEntity entity = validateCategory(id); + DocumentCategoryEntity oldCategoryEntity = Utils.getClonedEntityForData(entity); + DocumentCategoryEntity newCategoryEntity = updateCategoryEntity(entity, categoryRequest); /** This code is responsible for adding a version history log for the "Update Category" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCategoryEntity).newData(newCategoryEntity).build()); return convertToResponseBean(entity); } - public CategoryEntity updateCategoryEntity(CategoryEntity entity , CategoryRequest categoryRequest){ + public DocumentCategoryEntity updateCategoryEntity(DocumentCategoryEntity entity , DocumentCategoryRequest categoryRequest){ setIfUpdated(entity::getCategoryName, entity::setCategoryName, categoryRequest.getCategoryName()); setIfUpdated(entity::getDescription, entity::setDescription, categoryRequest.getDescription()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java index 03d16e67..7308a270 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java @@ -39,8 +39,8 @@ public class CompanyDocumentEntity extends BaseEntity { private UserWithCompanyEntity userWithCompany; @ManyToOne - @JoinColumn(name = "CATEGORY_ID") - private CategoryEntity categoryEntity; + @JoinColumn(name = "DOCUMENT_CATEGORY_ID") + private DocumentCategoryEntity categoryEntity; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java similarity index 81% rename from src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java rename to src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java index 9ebd2de7..25a25d6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CategoryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java @@ -6,9 +6,9 @@ import jakarta.persistence.Table; import lombok.Data; @Entity -@Table(name = "category") +@Table(name = "document_category") @Data -public class CategoryEntity extends BaseEntity { +public class DocumentCategoryEntity extends BaseEntity { @Column(name = "CATEGORY_NAME") private String categoryName; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 6cbeee5c..1029d9b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -206,7 +206,8 @@ public enum UserActionContextEnum { GET_DOCUMENT_CATEGORY("GET_DOCUMENT_CATEGORY"), DELETE_DOCUMENT_CATEGORY("DELETE_DOCUMENT_CATEGORY"), UPDATE_DOCUMENT_CATEGORY("UPDATE_DOCUMENT_CATEGORY"), - COMPANY_DOCUMENT_EXPIRATION_SCHEDULER("COMPANY_DOCUMENT_EXPIRATION_SCHEDULER"); + COMPANY_DOCUMENT_EXPIRATION_SCHEDULER("COMPANY_DOCUMENT_EXPIRATION_SCHEDULER"), + GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION("GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION"), GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/DocumentCategoryRequest.java similarity index 79% rename from src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java rename to src/main/java/net/gepafin/tendermanagement/model/request/DocumentCategoryRequest.java index 2512d80d..25fdb219 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CategoryRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/DocumentCategoryRequest.java @@ -3,7 +3,7 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; @Data -public class CategoryRequest { +public class DocumentCategoryRequest { private String categoryName; private String description; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java index e5765996..576cc324 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java @@ -24,6 +24,6 @@ public class CompanyDocumentResponseBean extends BaseBean { private Long userWithCompanyId; - private CategoryResponse category; + private DocumentCategoryResponse category; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentCategoryResponse.java similarity index 77% rename from src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java rename to src/main/java/net/gepafin/tendermanagement/model/response/DocumentCategoryResponse.java index 3eb8858b..3b5512e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CategoryResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentCategoryResponse.java @@ -4,7 +4,7 @@ import lombok.Data; import net.gepafin.tendermanagement.model.BaseBean; @Data -public class CategoryResponse extends BaseBean { +public class DocumentCategoryResponse extends BaseBean { private String categoryName; private String description; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentCategoryRepository.java similarity index 51% rename from src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java rename to src/main/java/net/gepafin/tendermanagement/repositories/DocumentCategoryRepository.java index 2253c5be..3b09eb60 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CategoryRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentCategoryRepository.java @@ -1,9 +1,9 @@ package net.gepafin.tendermanagement.repositories; -import net.gepafin.tendermanagement.entities.CategoryEntity; +import net.gepafin.tendermanagement.entities.DocumentCategoryEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface CategoryRepository extends JpaRepository { +public interface DocumentCategoryRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java b/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java deleted file mode 100644 index f0c8e35b..00000000 --- a/src/main/java/net/gepafin/tendermanagement/service/CategoryService.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.gepafin.tendermanagement.service; - -import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.request.CategoryRequest; -import net.gepafin.tendermanagement.model.response.CategoryResponse; - -public interface CategoryService { - - CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest); - CategoryResponse getDocumentCategoryById(HttpServletRequest request,Long id); - void deleteCategory(HttpServletRequest request,Long id); - CategoryResponse updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest); -} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java index b4ffdd10..dd469fe8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java @@ -12,7 +12,7 @@ import java.time.LocalDateTime; import java.util.List; public interface CompanyDocumentService { - List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long categoryId, CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate); + List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate); CompanyDocumentResponseBean updateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java new file mode 100644 index 00000000..f742c5f2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; + +public interface DocumentCategoryService { + + DocumentCategoryResponse createDocumentCategory(HttpServletRequest request, DocumentCategoryRequest categoryRequest); + DocumentCategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id); + void deleteDocumentCategory(HttpServletRequest request,Long id); + DocumentCategoryResponse updateDocumentCategory(HttpServletRequest request, Long id, DocumentCategoryRequest categoryRequest); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java index 3cd1cdba..8fa169d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java @@ -28,10 +28,10 @@ public class CompanyDocumentServiceImpl implements CompanyDocumentService { private CompanyDocumentDao companyDocumentDao; @Override - public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long categoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate) { + public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate) { Map userInfo = validator.getUserInfoFromToken(request); Long userId = validator.getUserId(userInfo); - return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,categoryId,documentSourceTypeEnum,expirationDate); + return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,documentCategoryId,documentSourceTypeEnum,expirationDate); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java similarity index 50% rename from src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java rename to src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java index bd175b44..bbb757e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CategoryServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java @@ -1,50 +1,50 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.dao.CategoryDao; -import net.gepafin.tendermanagement.model.request.CategoryRequest; -import net.gepafin.tendermanagement.model.response.CategoryResponse; -import net.gepafin.tendermanagement.service.CategoryService; +import net.gepafin.tendermanagement.dao.DocumentCategoryDao; +import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; +import net.gepafin.tendermanagement.service.DocumentCategoryService; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service -public class CategoryServiceImpl implements CategoryService { +public class DocumentCategoryServiceImpl implements DocumentCategoryService { @Autowired - CategoryDao categoryDao; + DocumentCategoryDao categoryDao; @Autowired private Validator validator; @Override @Transactional(rollbackFor = Exception.class) - public CategoryResponse createDocumentCategory(HttpServletRequest request, CategoryRequest categoryRequest) { + public DocumentCategoryResponse createDocumentCategory(HttpServletRequest request, DocumentCategoryRequest categoryRequest) { validator.validateUser(request); return categoryDao.createDocumentCategory(request,categoryRequest); } @Override @Transactional(readOnly = true) - public CategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id) { + public DocumentCategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id) { validator.validateUser(request); return categoryDao.getDocumentCategoryById(request,id); } @Override @Transactional(rollbackFor = Exception.class) - public void deleteCategory(HttpServletRequest request, Long id) { + public void deleteDocumentCategory(HttpServletRequest request, Long id) { validator.validateUser(request); - categoryDao.deleteCategory(request,id); + categoryDao.deleteDocumentCategory(request,id); } @Override @Transactional(rollbackFor = Exception.class) - public CategoryResponse updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest) { + public DocumentCategoryResponse updateDocumentCategory(HttpServletRequest request, Long id, DocumentCategoryRequest categoryRequest) { validator.validateUser(request); - return categoryDao.updateCategory(request,id,categoryRequest); + return categoryDao.updateDocumentCategory(request,id,categoryRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java index cfa523af..ba3409d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java @@ -40,7 +40,7 @@ public interface CompanyDocumentApi { @PostMapping(value = "/company/{companyId}/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) default ResponseEntity>> uploadFileForCompany(HttpServletRequest httpServletRequest, @Parameter(description = "Company Id", required = true) @PathVariable("companyId") Long companyId, - @Parameter(description = "The Category id", required = true) @RequestParam(value = "categoryId", required = false) Long categoryId, + @Parameter(description = "The Document Category id", required = true) @RequestParam(value = "documentCategoryId", required = false) Long documentCategoryId, @RequestParam("documentType") CompanyDocumentTypeEnum documentTypeEnum, @RequestParam("expirationDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime expirationDate, @RequestParam("file") List files) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java similarity index 79% rename from src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java rename to src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java index 4e3495f2..11d571bb 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CategoryApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java @@ -7,20 +7,17 @@ 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.CategoryRequest; -import net.gepafin.tendermanagement.model.request.HubReq; -import net.gepafin.tendermanagement.model.response.CategoryResponse; -import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; 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.*; @Validated -public interface CategoryApi { +public interface DocumentCategoryApi { @Operation(summary = "Api to create document category", responses = { @ApiResponse(responseCode = "200", description = "OK"), @@ -32,9 +29,9 @@ public interface CategoryApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "", produces = "application/json") - ResponseEntity> createDocumentCategory(HttpServletRequest request, - @Parameter(description = "Company Document Category request object", required = true) - @Valid @RequestBody CategoryRequest categoryRequest); + ResponseEntity> createDocumentCategory(HttpServletRequest request, + @Parameter(description = "Company Document Category request object", required = true) + @Valid @RequestBody DocumentCategoryRequest categoryRequest); @Operation(summary = "Api to get document category by id", responses = { @@ -47,8 +44,8 @@ public interface CategoryApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{id}", produces = "application/json") - ResponseEntity> getDocumentCategoryById(HttpServletRequest request, - @Parameter(description = "The category id", required = true) + ResponseEntity> getDocumentCategoryById(HttpServletRequest request, + @Parameter(description = "The document category id", required = true) @PathVariable("id") Long id); @@ -62,8 +59,8 @@ public interface CategoryApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @DeleteMapping(value = "/{id}") - ResponseEntity> deleteCategory(HttpServletRequest request, - @Parameter(description = "The category id", required = true) + ResponseEntity> deleteDocumentCategory(HttpServletRequest request, + @Parameter(description = "The document category id", required = true) @PathVariable("id") Long id); @@ -77,9 +74,9 @@ public interface CategoryApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{id}", produces = "application/json") - ResponseEntity> updateCategory(HttpServletRequest request, - @Parameter(description = "The category id", required = true) + ResponseEntity> updateDocumentCategory(HttpServletRequest request, + @Parameter(description = "The document category id", required = true) @PathVariable("id") Long id, - @Parameter(description = "Category request object", required = true) - @Valid @RequestBody CategoryRequest categoryRequest); + @Parameter(description = "Category request object", required = true) + @Valid @RequestBody DocumentCategoryRequest categoryRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java index df55fb19..8fd555c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java @@ -41,7 +41,7 @@ public class CompanyDocumentApiControlller implements CompanyDocumentApi { private CompanyDocumentDao companyDocumentDao; @Override - public ResponseEntity>> uploadFileForCompany(HttpServletRequest request, Long companyId, Long categoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate, + public ResponseEntity>> uploadFileForCompany(HttpServletRequest request, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate, List files) { try { UserActionContextEnum userActionContext = companyDocumentDao.getUserActionContextEnum(companyDocumentSourceTypeEnum); @@ -49,7 +49,7 @@ public class CompanyDocumentApiControlller implements CompanyDocumentApi { /** This code is responsible for creating user action logs for the "upload document for company" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(userActionContext).build()); - List responseBeans = companyDocumentService.uploadFileForCompany(request,files, companyId, categoryId ,companyDocumentSourceTypeEnum,expirationDate); + List responseBeans = companyDocumentService.uploadFileForCompany(request,files, companyId, documentCategoryId ,companyDocumentSourceTypeEnum,expirationDate); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java similarity index 68% rename from src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java rename to src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java index 42f92121..f1e99706 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CategoryApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java @@ -6,14 +6,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.CategoryRequest; +import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.CategoryResponse; -import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; import net.gepafin.tendermanagement.model.util.Response; -import net.gepafin.tendermanagement.service.CategoryService; +import net.gepafin.tendermanagement.service.DocumentCategoryService; import net.gepafin.tendermanagement.util.LoggingUtil; -import net.gepafin.tendermanagement.web.rest.api.CategoryApi; +import net.gepafin.tendermanagement.web.rest.api.DocumentCategoryApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -22,22 +21,22 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("${openapi.gepafin.base-path:/v1/category}") -public class CategoryApiController implements CategoryApi { +@RequestMapping("${openapi.gepafin.base-path:/v1/documentCategory}") +public class DocumentCategoryApiController implements DocumentCategoryApi { @Autowired LoggingUtil loggingUtil; @Autowired - CategoryService categoryService; + DocumentCategoryService categoryService; - public ResponseEntity> createDocumentCategory(HttpServletRequest request, @Valid CategoryRequest categoryRequest){ + public ResponseEntity> createDocumentCategory(HttpServletRequest request, @Valid DocumentCategoryRequest categoryRequest){ /** This code is responsible for creating user action logs for the "Create Document category" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT) .actionContext(UserActionContextEnum.CREATE_DOCUMENT_CATEGORY).build()); - CategoryResponse categoryResponse = categoryService.createDocumentCategory(request,categoryRequest); + DocumentCategoryResponse categoryResponse = categoryService.createDocumentCategory(request,categoryRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_CREATE_SUCCESS))); @@ -45,37 +44,37 @@ public class CategoryApiController implements CategoryApi { } @Override - public ResponseEntity> getDocumentCategoryById(HttpServletRequest request, Long id) { + public ResponseEntity> getDocumentCategoryById(HttpServletRequest request, Long id) { /** This code is responsible for creating user action logs for the "get document category by id" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_DOCUMENT_CATEGORY).build()); - CategoryResponse categoryResponse = categoryService.getDocumentCategoryById(request,id); + DocumentCategoryResponse categoryResponse = categoryService.getDocumentCategoryById(request,id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_GET_SUCCESS))); } @Override - public ResponseEntity> deleteCategory(HttpServletRequest request, Long id) { + public ResponseEntity> deleteDocumentCategory(HttpServletRequest request, Long id) { /** This code is responsible for creating user action logs for the "Delete category" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_DOCUMENT_CATEGORY).build()); - categoryService.deleteCategory(request,id); + categoryService.deleteDocumentCategory(request,id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_DELETE_SUCCESS))); } @Override - public ResponseEntity> updateCategory(HttpServletRequest request, Long id, CategoryRequest categoryRequest) { + public ResponseEntity> updateDocumentCategory(HttpServletRequest request, Long id, DocumentCategoryRequest categoryRequest) { /** This code is responsible for "Updating Category details" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) .actionContext(UserActionContextEnum.UPDATE_DOCUMENT_CATEGORY).build()); - CategoryResponse categoryResponse = categoryService.updateCategory(request,id, categoryRequest); + DocumentCategoryResponse categoryResponse = categoryService.updateDocumentCategory(request,id, categoryRequest); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_UPDATE_SUCCESS))); 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 60949149..e4232f22 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 @@ -2430,9 +2430,9 @@ - + - + @@ -2472,8 +2472,8 @@ - - + + @@ -2525,6 +2525,7 @@ + Date: Tue, 25 Feb 2025 14:40:41 +0530 Subject: [PATCH 29/50] Done ticket GEPAFINBE-173 --- .../constants/GepafinConstant.java | 19 +++- .../tendermanagement/dao/ApplicationDao.java | 100 ++++++++++++++++-- .../ApplicationPageableRequestBean.java | 3 + .../model/request/FilterCriteria.java | 10 ++ 4 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8e469734..1c31a2c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -426,7 +426,24 @@ public class GepafinConstant { public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; -} + public static final String CONTAINS = "contains"; + public static final String EQUALS = "equals"; + public static final String STARTS_WITH = "starts_with"; + public static final String ENDS_WITH = "ends_with"; + public static final String CALL_TITLE = "callTitle"; + public static final String CALL_ID="callId"; + public static final String CALL_END_DATE="callEndDate"; + public static final String END_DATE="endDate"; + public static final String PROTOCOL="protocol"; + public static final String PROTOCOL_NUMBER="protocolNumber"; + public static final String MODIFIED_DATE="modifiedDate"; + public static final String CALL_END_TIME="callEndTime"; + public static final String END_TIME="endTime"; + public static final String UPDATED_DATE="updatedDate"; + public static final String BEFORE="before"; + public static final String AFTER="after"; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a8e1ca8d..d749897b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.dao; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.*; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -42,7 +41,6 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; @@ -55,6 +53,7 @@ import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1444,7 +1443,7 @@ public class ApplicationDao { Integer pageLimit = null; UserWithCompanyEntity userWithCompany= userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId).orElse(null); - + Long userWithCompanyId = userWithCompany!=null?userWithCompany.getId():null; if (applicationPageableRequestBean.getGlobalFilters() != null) { pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); @@ -1455,7 +1454,7 @@ public class ApplicationDao { if (pageNo == null || pageNo <= 0) { pageNo = GepafinConstant.DEFAULT_PAGE; } - Specification spec = search(callId,companyId, userWithCompany.getId(), applicationPageableRequestBean, userEntity); + Specification spec = search(callId,companyId, userWithCompanyId, applicationPageableRequestBean, userEntity); Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); // Prepare the response @@ -1510,11 +1509,15 @@ public class ApplicationDao { Integer year = null; String search = null; Integer daysRange = null; + Map filters = new HashMap<>(); if (applicationPageableRequestBean.getGlobalFilters() != null) { year = applicationPageableRequestBean.getGlobalFilters().getYear(); search = applicationPageableRequestBean.getGlobalFilters().getSearch(); daysRange = applicationPageableRequestBean.getDaysRange(); } + if (applicationPageableRequestBean.getFilters() != null) { + filters = applicationPageableRequestBean.getFilters(); + } List predicates = new ArrayList<>(); Boolean isBeneficiary = validator.checkIsBeneficiary(); @@ -1567,13 +1570,98 @@ public class ApplicationDao { 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))); + applyFilters(root, criteriaBuilder, predicates, filters); + + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); return predicates; } + private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { + if (Boolean.FALSE.equals(filters.isEmpty())) { + for (Map.Entry entry : filters.entrySet()) { + String fieldName = entry.getKey(); + FilterCriteria filterCriteria = entry.getValue(); + Object value = filterCriteria.getValue(); + String matchMode = filterCriteria.getMatchMode(); + + if (value != null && matchMode != null) { + Path fieldPath = getFieldPath(root, fieldName); + if (fieldPath != null) { + applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + // applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); // Date filter is commented + } + } + } + } + } + + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (value instanceof String) { + String valueStr = (String) value; + if (fieldPath.getJavaType().equals(String.class)) { + switch (matchMode.toLowerCase()) { + case GepafinConstant.CONTAINS -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case GepafinConstant.STARTS_WITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); + case GepafinConstant.ENDS_WITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); + } + } + } + } + + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { + Number numberValue = null; + if (value instanceof Number) { + numberValue = (Number) value; + } + switch (matchMode.toLowerCase()) { + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + } + } + } + +/* +private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); + + Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); + + switch (matchMode.toLowerCase()) { + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); + case GepafinConstant.BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); + case GepafinConstant.AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + } + } +} +*/ + + private Path getFieldPath(Root root, String fieldName) { + try { + return switch (fieldName) { + case GepafinConstant.CALL_ID -> root.get(GepafinConstant.CALL).get(GepafinConstant.ID); + case GepafinConstant.CALL_TITLE -> root.get(GepafinConstant.CALL).get(GepafinConstant.NAME); + case GepafinConstant.CALL_END_DATE -> root.get(GepafinConstant.CALL).get(GepafinConstant.END_DATE); + case GepafinConstant.CALL_END_TIME -> root.get(GepafinConstant.CALL).get(GepafinConstant.END_TIME); + case GepafinConstant.MODIFIED_DATE -> root.get(GepafinConstant.CALL).get(GepafinConstant.UPDATED_DATE); + case GepafinConstant.PROTOCOL_NUMBER-> root.get(GepafinConstant.PROTOCOL).get(GepafinConstant.PROTOCOL_NUMBER); + default -> root.get(fieldName); + }; + } catch (IllegalArgumentException e) { + return null; + } + } + + public void checkCallEndDate(CallEntity call) { LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); 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 153164d6..d6468973 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java @@ -4,6 +4,7 @@ import lombok.Data; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import java.util.List; +import java.util.Map; @Data public class ApplicationPageableRequestBean { @@ -13,4 +14,6 @@ public class ApplicationPageableRequestBean { private Integer daysRange; private List status; + + private Map filters; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java new file mode 100644 index 00000000..df7eaf69 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FilterCriteria { + + private Object value; + private String matchMode; +} From 10afb623a730bb9a5193e5ec0d669bc0ac7f1339 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 25 Feb 2025 16:08:01 +0530 Subject: [PATCH 30/50] Updated code --- .../constants/GepafinConstant.java | 8 ++--- .../tendermanagement/dao/ApplicationDao.java | 34 +++++++++++-------- .../tendermanagement/enums/MatchModeEnum.java | 25 ++++++++++++++ .../model/request/FilterCriteria.java | 3 +- 4 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 1c31a2c7..efd6bcda 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -426,10 +426,7 @@ public class GepafinConstant { public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; - public static final String CONTAINS = "contains"; - public static final String EQUALS = "equals"; - public static final String STARTS_WITH = "starts_with"; - public static final String ENDS_WITH = "ends_with"; + public static final String CALL_TITLE = "callTitle"; public static final String CALL_ID="callId"; public static final String CALL_END_DATE="callEndDate"; @@ -440,8 +437,7 @@ public class GepafinConstant { public static final String CALL_END_TIME="callEndTime"; public static final String END_TIME="endTime"; public static final String UPDATED_DATE="updatedDate"; - public static final String BEFORE="before"; - public static final String AFTER="after"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d749897b..205ff89a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1585,7 +1585,7 @@ public class ApplicationDao { String fieldName = entry.getKey(); FilterCriteria filterCriteria = entry.getValue(); Object value = filterCriteria.getValue(); - String matchMode = filterCriteria.getMatchMode(); + MatchModeEnum matchMode = filterCriteria.getMatchMode(); if (value != null && matchMode != null) { Path fieldPath = getFieldPath(root, fieldName); @@ -1599,47 +1599,51 @@ public class ApplicationDao { } } - private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (value instanceof String) { String valueStr = (String) value; if (fieldPath.getJavaType().equals(String.class)) { - switch (matchMode.toLowerCase()) { - case GepafinConstant.CONTAINS -> + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + case CONTAINS -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); - case GepafinConstant.STARTS_WITH -> + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case STARTSWITH -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); - case GepafinConstant.ENDS_WITH -> + case ENDSWITH -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); } } } } - private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { Number numberValue = null; if (value instanceof Number) { numberValue = (Number) value; } - switch (matchMode.toLowerCase()) { - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); } } } /* -private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { +private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); - switch (matchMode.toLowerCase()) { - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); - case GepafinConstant.BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); - case GepafinConstant.AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); } } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java new file mode 100644 index 00000000..dc2383c0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + + +public enum MatchModeEnum { + STARTSWITH("STARTSWITH"), + ENDSWITH("ENDSWITH"), + CONTAINS("CONTAINS"), + EQUALS("EQUALS"), + BEFORE("BEFORE"), + AFTER("AFTER"), + EXPIRED("EXPIRED"); + + private String value; + + MatchModeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java index df7eaf69..25690086 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java @@ -1,10 +1,11 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import net.gepafin.tendermanagement.enums.MatchModeEnum; @Data public class FilterCriteria { private Object value; - private String matchMode; + private MatchModeEnum matchMode; } From 73e5eca44c6201ef5a2e6c2179844f7ba1e6e347 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 25 Feb 2025 16:18:43 +0530 Subject: [PATCH 31/50] Updated code --- .../java/net/gepafin/tendermanagement/enums/MatchModeEnum.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index dc2383c0..836eb592 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -9,8 +9,7 @@ public enum MatchModeEnum { CONTAINS("CONTAINS"), EQUALS("EQUALS"), BEFORE("BEFORE"), - AFTER("AFTER"), - EXPIRED("EXPIRED"); + AFTER("AFTER"); private String value; From 3eafa0b71041dea2eae4577909a4ab622101ae2d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 26 Feb 2025 12:45:38 +0530 Subject: [PATCH 32/50] Done ticket GEPAFINBE-174 --- .../constants/GepafinConstant.java | 6 ++ .../tendermanagement/dao/DashboardDao.java | 24 ++++++++ .../gepafin/tendermanagement/dao/PecDao.java | 59 +++++++++++++++++++ .../SuperAdminWidgetResponseBean.java | 7 +++ .../service/feignClient/PecFeignService.java | 19 ++++++ .../service/impl/PecEmailService.java | 4 +- .../web/rest/api/DashboardApi.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 5 ++ ...ta_for_email_service_config_25-02-2025.sql | 4 ++ 9 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/PecDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignService.java create mode 100644 src/main/resources/db/dump/updated_hub_data_for_email_service_config_25-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 382ea8ca..122f8649 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -453,6 +453,12 @@ public class GepafinConstant { public static final String SWITCH="switch"; public static final String IS_CHECK_LIST_ITEM="isChecklistItem"; public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist"; + public static final String PEC_SERVICE_URL="https://ws.pecmassiva.com"; + public static final String PEC_SERVICE_SEND_MAIL="/send"; + public static final String PEC_SERVICE_INBOX_MAIL="/quota/inbox"; + public static final String USAGE="usage"; + public static final String LIMIT="limit"; + public static final String DATA="data"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 29304f15..e80e67e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import com.amazonaws.services.dynamodbv2.xspec.S; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -16,6 +17,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio 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.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.math.BigDecimal; @@ -62,14 +64,36 @@ public class DashboardDao { @Autowired private Validator validator; + @Autowired + private PecDao pecDao; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; + public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) { SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); widgetResponseBean.setWidget1(createWidget1(requestedUserEntity)); Map widgetBars = getStatistics(requestedUserEntity); widgetResponseBean.setWidgetBars(widgetBars); + if(requestedUserEntity.getHub().getUniqueUuid().equals(defaultHubUuid)) { + getEmailUsageForGepafin(requestedUserEntity, widgetResponseBean); + } return widgetResponseBean; } + private void getEmailUsageForGepafin(UserEntity requestedUserEntity, SuperAdminWidgetResponseBean widgetResponseBean) { + Map emailData=pecDao.getUsageDetails(requestedUserEntity.getHub().getId()); + Map data= (Map) emailData.get(GepafinConstant.DATA); + Object usage=data.get(GepafinConstant.USAGE); + Object limit=data.get(GepafinConstant.LIMIT); + if(usage!=null) { + widgetResponseBean.setPecUsage(String.valueOf(usage)); + } + if (limit!=null) { + widgetResponseBean.setPecLimit(String.valueOf(limit)); + } + } + private Widget1 createWidget1(UserEntity requestedUserEntity) { Widget1 widget1 = initializeWidget1(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PecDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PecDao.java new file mode 100644 index 00000000..bfb88fa7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/PecDao.java @@ -0,0 +1,59 @@ +package net.gepafin.tendermanagement.dao; + +import feign.FeignException; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.EmailConfig; +import net.gepafin.tendermanagement.service.feignClient.PecFeignService; +import net.gepafin.tendermanagement.util.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Component +public class PecDao { + + public final Logger log = LoggerFactory.getLogger(PecDao.class); + + @Autowired + private PecFeignService pecFeignService; + + @Autowired + private EmailNotificationDao emailNotificationDao; + + + public Map getUsageDetails(Long hubId) { + EmailConfig emailConfig = emailNotificationDao.retrieveEmailConfig(hubId); + + Map responseBody = new HashMap<>(); + try { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set(GepafinConstant.AUTHORIZATION, "Bearer " + emailConfig.getAuthToken()); + headers.set("x-username", emailConfig.getUsername()); + headers.set("x-password", emailConfig.getPassword()); + headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"); + + URI baseUrl = URI.create(GepafinConstant.PEC_SERVICE_URL+GepafinConstant.PEC_SERVICE_INBOX_MAIL); + ResponseEntity response = pecFeignService.getUsageDetails(baseUrl,headers); + + + if (response.getStatusCode() == HttpStatus.OK && response.hasBody()) { + log.info("Successfully fetched usage and limit"); + responseBody = (Map) response.getBody(); + } + } catch (FeignException ex) { + } + return responseBody; + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/SuperAdminWidgetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/SuperAdminWidgetResponseBean.java index 02744ace..cc75e5c5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/SuperAdminWidgetResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/SuperAdminWidgetResponseBean.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.model.response; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import net.gepafin.tendermanagement.entities.UserActionEntity; import org.springframework.data.domain.Page; @@ -12,6 +13,12 @@ public class SuperAdminWidgetResponseBean { private Widget1 widget1; + @JsonInclude(JsonInclude.Include.NON_NULL) + private String pecUsage; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private String pecLimit; + private Map widgetBars; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignService.java new file mode 100644 index 00000000..dd1d066d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import net.gepafin.tendermanagement.constants.GepafinConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.net.URI; + + +@FeignClient(value = "pec-service" ,url = GepafinConstant.PEC_SERVICE_URL) +public interface PecFeignService { + + @GetMapping(GepafinConstant.PEC_SERVICE_INBOX_MAIL) + ResponseEntity getUsageDetails(URI uri,@RequestHeader HttpHeaders headers + ); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java index 67e58c2d..8c44af9d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.service.impl; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.EmailLogDao; import net.gepafin.tendermanagement.entities.EmailLogEntity; import net.gepafin.tendermanagement.enums.EmailServiceTypeEnum; @@ -13,6 +14,7 @@ import net.gepafin.tendermanagement.model.request.PecEmailRequest; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -49,7 +51,7 @@ public class PecEmailService implements EmailService { emailRequest.setUsername(emailConfig.getUsername()); emailRequest.setPassword(emailConfig.getPassword()); emailRequest.setRecipient(recipientEmails); - String url=emailConfig.getUrl(); + String url=emailConfig.getUrl()+ GepafinConstant.PEC_SERVICE_SEND_MAIL; String authToken = emailConfig.getAuthToken(); HttpResponse response2=null; if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { 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 a6aebf4e..d0fb4bef 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 @@ -35,7 +35,7 @@ public interface DashboardApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') || hasRole('ROLE_INSTRUCTOR_MANAGER')") ResponseEntity> getDashboardWidgetForSuperAdmin(HttpServletRequest request); @Operation(summary = "Api to get dashboard widget for beneficiary", 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 aacc398a..7493f149 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 @@ -2435,4 +2435,9 @@ newColumnName="appointment_template_id"/> + + + + diff --git a/src/main/resources/db/dump/updated_hub_data_for_email_service_config_25-02-2025.sql b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_25-02-2025.sql new file mode 100644 index 00000000..39bd2860 --- /dev/null +++ b/src/main/resources/db/dump/updated_hub_data_for_email_service_config_25-02-2025.sql @@ -0,0 +1,4 @@ +UPDATE hub +SET email_service_type = 'PEC_SERVICE', + email_service_config = 'JkFbBfuVvq7VWwp5LcWIi+hAa1RJ1ekI0jq3w7gLTXETZiTaN8zC4OBWD53x8FtbfFTh3L/5805CIYTH1BQGa3X9q16q9SDzMy7DKHdmJzOnLKhn74C5akoXKaeXUCGnzp0cSk2c01FV6lwefC29IshijFSumCHtVlgWNeZigBzmWK+M7NS+EXf4goIMzguL5bHpYXfoQunQozeY1SpOoxf4XZfd/MNPeVOA/ZNHDGU=' +WHERE UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs'; \ No newline at end of file From a8beb632485e365c99693e523ec407b3366e5bf3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 26 Feb 2025 16:37:44 +0530 Subject: [PATCH 33/50] Added get all document category api --- .../dao/DocumentCategoryDao.java | 9 +++++++++ .../enums/UserActionContextEnum.java | 1 + .../service/DocumentCategoryService.java | 3 +++ .../impl/DocumentCategoryServiceImpl.java | 8 ++++++++ .../web/rest/api/DocumentCategoryApi.java | 14 ++++++++++++++ .../impl/DocumentCategoryApiController.java | 18 ++++++++++++++++++ 6 files changed, 53 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java index 5dc799fb..1b17e888 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentCategoryDao.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; +import jdk.jfr.Category; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.DocumentCategoryEntity; @@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; +import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -108,4 +110,11 @@ public class DocumentCategoryDao { return entity; } + + public List getAllDocumentCategory(){ + List documentCategoryEntityList = categoryRepository.findAll(); + return documentCategoryEntityList.stream() + .map(this::convertToResponseBean) + .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 1029d9b1..64a43904 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -207,6 +207,7 @@ public enum UserActionContextEnum { DELETE_DOCUMENT_CATEGORY("DELETE_DOCUMENT_CATEGORY"), UPDATE_DOCUMENT_CATEGORY("UPDATE_DOCUMENT_CATEGORY"), COMPANY_DOCUMENT_EXPIRATION_SCHEDULER("COMPANY_DOCUMENT_EXPIRATION_SCHEDULER"), + GET_ALL_DOCUMENT_CATEGORY("GET_ALL_DOCUMENT_CATEGORY"), GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION("GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION"), GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java index f742c5f2..1b936239 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentCategoryService.java @@ -4,10 +4,13 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.request.DocumentCategoryRequest; import net.gepafin.tendermanagement.model.response.DocumentCategoryResponse; +import java.util.List; + public interface DocumentCategoryService { DocumentCategoryResponse createDocumentCategory(HttpServletRequest request, DocumentCategoryRequest categoryRequest); DocumentCategoryResponse getDocumentCategoryById(HttpServletRequest request, Long id); void deleteDocumentCategory(HttpServletRequest request,Long id); DocumentCategoryResponse updateDocumentCategory(HttpServletRequest request, Long id, DocumentCategoryRequest categoryRequest); + List getAllDocumentCategory(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java index bbb757e7..8242263b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentCategoryServiceImpl.java @@ -10,6 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service public class DocumentCategoryServiceImpl implements DocumentCategoryService { @@ -47,5 +49,11 @@ public class DocumentCategoryServiceImpl implements DocumentCategoryService { return categoryDao.updateDocumentCategory(request,id,categoryRequest); } + @Override + public List getAllDocumentCategory(HttpServletRequest request) { + validator.validateUser(request); + return categoryDao.getAllDocumentCategory(); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java index 11d571bb..9d302a15 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentCategoryApi.java @@ -16,6 +16,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Validated public interface DocumentCategoryApi { @@ -79,4 +81,16 @@ public interface DocumentCategoryApi { @PathVariable("id") Long id, @Parameter(description = "Category request object", required = true) @Valid @RequestBody DocumentCategoryRequest categoryRequest); + + @Operation(summary = "Api to get all document category", + 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>> getAllDocumentCategory(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java index f1e99706..9a81d672 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentCategoryApiController.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import lombok.extern.log4j.Log4j2; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; @@ -20,8 +21,11 @@ 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/documentCategory}") +@Log4j2 public class DocumentCategoryApiController implements DocumentCategoryApi { @Autowired @@ -79,4 +83,18 @@ public class DocumentCategoryApiController implements DocumentCategoryApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(categoryResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_UPDATE_SUCCESS))); } + + @Override + public ResponseEntity>> getAllDocumentCategory(HttpServletRequest request) { + log.info("Get All Document Category"); + + /** This code is responsible for creating user action logs for the "get all document category" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ALL_DOCUMENT_CATEGORY).build()); + + List documentCategoryResponseList = categoryService.getAllDocumentCategory(request); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(documentCategoryResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_CATEGORY_GET_SUCCESS))); + + } } From 28137422db9bfe4fd42ae00e4fa6ca6701c8028f Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 27 Feb 2025 11:50:14 +0530 Subject: [PATCH 34/50] Added date filter in pagination endpoint --- .../tendermanagement/dao/ApplicationDao.java | 41 +++++++++++-------- .../tendermanagement/enums/MatchModeEnum.java | 27 +++++++++--- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 205ff89a..63e399b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.*; 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; @@ -47,6 +46,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.sql.Timestamp; import java.text.MessageFormat; import java.text.NumberFormat; import java.text.ParseException; @@ -54,6 +54,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -63,6 +64,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static org.apache.commons.lang3.StringUtils.isEmpty; +import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; @Component public class ApplicationDao { @@ -1592,7 +1594,7 @@ public class ApplicationDao { if (fieldPath != null) { applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); - // applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); // Date filter is commented + applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); } } } @@ -1603,7 +1605,7 @@ public class ApplicationDao { if (value instanceof String) { String valueStr = (String) value; if (fieldPath.getJavaType().equals(String.class)) { - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case CONTAINS -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); @@ -1623,31 +1625,36 @@ public class ApplicationDao { if (value instanceof Number) { numberValue = (Number) value; } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); } } } -/* -private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { - if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); - LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); - Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); + public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { + // Use ISO_LOCAL_DATE_TIME to parse the input string + return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); - switch (mode) { + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + LocalDateTime testDateTime = parseStringToLocalDateTime(value.toString()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); - case EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + + switch (mode) { +// case DATEIS -> predicates.add(criteriaBuilder.equal(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + } } } -} -*/ + + + private Path getFieldPath(Root root, String fieldName) { try { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index 836eb592..f3ee252c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,18 +4,33 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("STARTSWITH"), - ENDSWITH("ENDSWITH"), - CONTAINS("CONTAINS"), - EQUALS("EQUALS"), - BEFORE("BEFORE"), - AFTER("AFTER"); + STARTSWITH("Starts with"), + ENDSWITH("Ends with"), + CONTAINS("Contains"), + EQUALS("Equals"), + DATEIS("Date is"), + DATEISNOT("Date is not"), + BEFORE("Date is before"), + AFTER("Date is after"); private String value; MatchModeEnum(String value) { this.value = value; } + public static MatchModeEnum fromObject(Object value) { + if (value instanceof String) { + String strValue = ((String) value).trim(); + for (MatchModeEnum mode : MatchModeEnum.values()) { + if (mode.getValue().equalsIgnoreCase(strValue)) { + return mode; + } + } + } + throw new IllegalArgumentException("Invalid MatchModeEnum: " + value); + } + + @JsonValue public String getValue() { From bc2a546012da148c52e7de26539ad816b3632753 Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 27 Feb 2025 12:17:47 +0530 Subject: [PATCH 35/50] Updated code --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 ++----- .../net/gepafin/tendermanagement/util/DateTimeUtil.java | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 390fbd89..92ffc2d3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1649,14 +1649,11 @@ public class ApplicationDao { } - public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { - // Use ISO_LOCAL_DATE_TIME to parse the input string - return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - LocalDateTime testDateTime = parseStringToLocalDateTime(value.toString()); + LocalDateTime testDateTime = DateTimeUtil.parseStringToLocalDateTime(value.toString()); MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index ec7fe7d9..1a68818f 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -92,6 +92,10 @@ public class DateTimeUtil { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(dateTimeStr, formatter); } + public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { + // Use ISO_LOCAL_DATE_TIME to parse the input string + return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } public static String parseLocalTimeToString(LocalTime time, String format) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); From 274609af29b4e8fc39e6ab901e31b6e22c101cf7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 14:51:51 +0530 Subject: [PATCH 36/50] Added name field in company document --- .../gepafin/tendermanagement/dao/CompanyDocumentDao.java | 7 +++++-- .../tendermanagement/entities/CompanyDocumentEntity.java | 3 +++ .../model/response/CompanyDocumentResponseBean.java | 4 +++- .../tendermanagement/service/CompanyDocumentService.java | 2 +- .../service/impl/CompanyDocumentServiceImpl.java | 4 ++-- .../web/rest/api/CompanyDocumentApi.java | 1 + .../web/rest/api/impl/CompanyDocumentApiControlller.java | 4 ++-- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 9 +++++++++ 8 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index a9f45b86..c13104ff 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -86,7 +86,7 @@ public class CompanyDocumentDao { @Autowired private Validator validator; - public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate){ + public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate,String name){ DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId); validator.validateUserWithCompany(request,companyId); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userId,companyId); @@ -106,6 +106,7 @@ public class CompanyDocumentDao { companyDocumentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); companyDocumentEntity.setIsDeleted(false); companyDocumentEntity.setUploadedBy(userId); + companyDocumentEntity.setName(name); if (expirationDate.isBefore(currentDate.plusDays(7))) { companyDocumentEntity.setStatus(CompanyDocumentStatusEnum.DUE.getValue()); } else { @@ -159,7 +160,7 @@ public class CompanyDocumentDao { DocumentCategoryEntity categoryEntity = entity.getCategoryEntity(); DocumentCategoryResponse responseCategory = categoryDao.convertToResponseBean(categoryEntity); responseBean.setId(entity.getId()); - responseBean.setName(entity.getFileName()); + responseBean.setFileName(entity.getFileName()); responseBean.setType(CompanyDocumentTypeEnum.valueOf(entity.getType())); responseBean.setFilePath(entity.getFilePath()); responseBean.setCompanyId(entity.getCompanyId()); @@ -167,9 +168,11 @@ public class CompanyDocumentDao { responseBean.setStatus(entity.getStatus()); responseBean.setUploadedBy(entity.getUploadedBy()); responseBean.setCategory(responseCategory); + responseBean.setName(entity.getName()); responseBean.setUserWithCompanyId(entity.getUserWithCompany().getId()); responseBean.setCreatedDate(entity.getCreatedDate()); responseBean.setUpdatedDate(entity.getUpdatedDate()); + return responseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java index 7308a270..15c3457c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java @@ -16,6 +16,9 @@ public class CompanyDocumentEntity extends BaseEntity { @Column(name = "FILE_PATH") private String filePath; + @Column(name ="name") + private String name; + @Column(name="TYPE") private String type; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java index 576cc324..73c13fdc 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyDocumentResponseBean.java @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Data public class CompanyDocumentResponseBean extends BaseBean { - private String name; + private String fileName; private String filePath; @@ -16,6 +16,8 @@ public class CompanyDocumentResponseBean extends BaseBean { private Long companyId; + private String name; + private String status; private LocalDateTime expirationDate; diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java index dd469fe8..b7604509 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java @@ -12,7 +12,7 @@ import java.time.LocalDateTime; import java.util.List; public interface CompanyDocumentService { - List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate); + List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate,String name); CompanyDocumentResponseBean updateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId, CompanyDocumentRequest companyDocumentRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java index 8fa169d8..8af71f1d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java @@ -28,10 +28,10 @@ public class CompanyDocumentServiceImpl implements CompanyDocumentService { private CompanyDocumentDao companyDocumentDao; @Override - public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate) { + public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate,String name) { Map userInfo = validator.getUserInfoFromToken(request); Long userId = validator.getUserId(userInfo); - return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,documentCategoryId,documentSourceTypeEnum,expirationDate); + return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,documentCategoryId,documentSourceTypeEnum,expirationDate,name); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java index ba3409d5..f31de82d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java @@ -41,6 +41,7 @@ public interface CompanyDocumentApi { default ResponseEntity>> uploadFileForCompany(HttpServletRequest httpServletRequest, @Parameter(description = "Company Id", required = true) @PathVariable("companyId") Long companyId, @Parameter(description = "The Document Category id", required = true) @RequestParam(value = "documentCategoryId", required = false) Long documentCategoryId, + @Parameter(description = "The Document Name", required = true) @RequestParam(value = "name", required = false) String name, @RequestParam("documentType") CompanyDocumentTypeEnum documentTypeEnum, @RequestParam("expirationDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime expirationDate, @RequestParam("file") List files) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java index 8fd555c2..83a73f97 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java @@ -41,7 +41,7 @@ public class CompanyDocumentApiControlller implements CompanyDocumentApi { private CompanyDocumentDao companyDocumentDao; @Override - public ResponseEntity>> uploadFileForCompany(HttpServletRequest request, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate, + public ResponseEntity>> uploadFileForCompany(HttpServletRequest request, Long companyId, Long documentCategoryId, String name ,CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate, List files) { try { UserActionContextEnum userActionContext = companyDocumentDao.getUserActionContextEnum(companyDocumentSourceTypeEnum); @@ -49,7 +49,7 @@ public class CompanyDocumentApiControlller implements CompanyDocumentApi { /** This code is responsible for creating user action logs for the "upload document for company" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(userActionContext).build()); - List responseBeans = companyDocumentService.uploadFileForCompany(request,files, companyId, documentCategoryId ,companyDocumentSourceTypeEnum,expirationDate); + List responseBeans = companyDocumentService.uploadFileForCompany(request,files, companyId, documentCategoryId ,companyDocumentSourceTypeEnum,expirationDate,name); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { 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 1e7c049f..294865ea 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 @@ -2536,5 +2536,14 @@ + + + + + + + + + From 2f746e503b02dc4e3bacb15505166d517c1fcad0 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 15:00:56 +0530 Subject: [PATCH 37/50] updated code --- .../net/gepafin/tendermanagement/dao/CompanyDocumentDao.java | 1 + .../tendermanagement/model/request/CompanyDocumentRequest.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index c13104ff..9cee39b6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -197,6 +197,7 @@ public class CompanyDocumentDao { DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(companyDocumentRequest.getCategoryId()); setIfUpdated(companyDocumentEntity::getCategoryEntity, companyDocumentEntity::setCategoryEntity, categoryEntity); } + setIfUpdated(companyDocumentEntity::getName, companyDocumentEntity::setName, companyDocumentRequest.getName()); companyDocumentRepository.save(companyDocumentEntity); /** This code is responsible for adding a version history log for the "updating company document" operation. **/ diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java index 41d167ca..9dcf7917 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyDocumentRequest.java @@ -8,5 +8,6 @@ import java.time.LocalDateTime; @Data public class CompanyDocumentRequest { private Long categoryId; + private String name ; private LocalDateTime expirationDate; } From 65a8d6e9715c034a2be80064aec9a39c75ee70ce Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 27 Feb 2025 16:43:07 +0530 Subject: [PATCH 38/50] Updated code for call end date time updation --- .../gepafin/tendermanagement/dao/CallDao.java | 35 ++++++++++++++++--- .../enums/UserActionContextEnum.java | 3 +- .../service/impl/CallServiceImpl.java | 2 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index a913713f..87398d17 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -571,7 +571,7 @@ public class CallDao { } } - public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { + public CallResponse updateCallStep1(HttpServletRequest request,CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); @@ -580,15 +580,41 @@ public class CallDao { setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong, updateCallRequest.getDescriptionLong()); List dates=updateCallRequest.getDates(); - + boolean isEndDateUpdated = false; + boolean isEndTimeUpdated = false; if (dates != null && dates.size()>1) { if (dates.size() > 0) { setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0)); } if (dates.size() > 1) { - setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + LocalDate requestEndDate = dates.get(1).toLocalDate(); // Extract only the date + LocalDate storedEndDate = callEntity.getEndDate().toLocalDate(); // Extract only the date + + if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different + + setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + isEndDateUpdated = true; + } } } + + if (updateCallRequest.getEndTime() != null) { + LocalTime requestEndTime = DateTimeUtil.parseTime(updateCallRequest.getEndTime()); + LocalTime storedEndTime = callEntity.getEndTime(); + + if (!requestEndTime.equals(storedEndTime)) { + setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); + isEndTimeUpdated = true; + } + } + if (isEndDateUpdated || isEndTimeUpdated) { + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_CALL_END_DATE_AND_TIME) + .build()); + } + // setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); // setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, updateCallRequest.getEndDate()); setIfUpdated(callEntity::getAmount, callEntity::setAmount, updateCallRequest.getAmount()); @@ -606,7 +632,6 @@ public class CallDao { setIfUpdated(callEntity::getEmail, callEntity::setEmail, updateCallRequest.getEmail()); setIfUpdated(callEntity::getPhoneNumber, callEntity::setPhoneNumber, updateCallRequest.getPhoneNumber()); 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()); setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck()); @@ -1089,4 +1114,4 @@ public class CallDao { createCallResponseBean.setCurrentStep(GepafinConstant.EVALUATION_V2_STEP_2); return createCallResponseBean; } -} + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 1029d9b1..23695ca6 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -211,7 +211,8 @@ public enum UserActionContextEnum { GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION("GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION"), GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), - GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"); + GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"), + UPDATE_CALL_END_DATE_AND_TIME("UPDATE_CALL_END_DATE_AND_TIME"); private final String value; 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 a621662c..c5b6952b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -50,7 +50,7 @@ public class CallServiceImpl implements CallService { UpdateCallRequestStep1 updateCallRequest) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); - return callDao.updateCallStep1(call, updateCallRequest, user); + return callDao.updateCallStep1(request,call, updateCallRequest, user); } @Override @Transactional(readOnly = true) From ec6fe90000492786c4ed81b121e83d04804e76ab Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 19:11:27 +0530 Subject: [PATCH 39/50] Done ticket GEPAFINBE-175 --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 50 ++++++++++++++++++- .../dao/ApplicationEvaluationDao.java | 2 +- .../dao/EmailNotificationDao.java | 2 +- .../enums/ApplicationStatusTypeEnum.java | 3 +- .../enums/EmailScenarioTypeEnum.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 5 ++ ...ail_template_email_scenario_27_02_2025.sql | 2 + src/main/resources/message_en.properties | 3 +- src/main/resources/message_it.properties | 2 + 10 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/db/dump/updated_system_email_template_email_scenario_27_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 4afb7238..c673a85d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -468,6 +468,7 @@ public class GepafinConstant { public static final String SWITCH="switch"; public static final String IS_CHECK_LIST_ITEM="isChecklistItem"; public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist"; + public static final String INSUFFICIENT_SCORE_MESSAGE ="insufficient.score.msg"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 491e9796..ef145bc3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Root; import 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; @@ -917,8 +918,10 @@ public class ApplicationDao { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { + log.info("Updating status for Application id : " + applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId); checkCallEndDate(applicationEntity.getCall()); + log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); @@ -949,14 +952,22 @@ public class ApplicationDao { sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); applicationEntity.setStatus(status.getValue()); + log.info("Status updated to SUBMIT for applicationId: " + applicationId); } if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { applicationEntity.setStatus(status.getValue()); + log.info("Status updated to DRAFT for applicationId: " + applicationId); } if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ applicationEntity.setStatus(status.getValue()); + log.info("Status updated to ADMISSIBLE for applicationId: " + applicationId); + emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(applicationEntity); + } + if(status.equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ + processTechnicalEvaluation(applicationId, applicationEntity, status); } applicationEntity = applicationRepository.save(applicationEntity); + log.info("Application status updated successfully | applicationId: {}, newStatus: {}", applicationId, applicationEntity.getStatus()); if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) { /** This code is responsible for adding a version history log for "Update application status" operation. **/ @@ -966,6 +977,43 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } + private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusTypeEnum status){ + Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if (evaluationEntityOpt.isPresent()){ + ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); + String criteriaJson = evaluationEntity.getCriteria(); + if (criteriaJson != null){ + Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); + if (totalScore > 40) { + applicationEntity.setStatus(status.getValue()); + log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); + } + else{ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); + } + } + } + } + + private Integer calculateTotalScore(String criteriaJson){ + try { + ObjectMapper objectMapper = new ObjectMapper(); + // Convert JSON string to List of Maps + List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { + }); + + // Sum all scores (ignoring null scores) + Integer totalScore = criteriaList.stream() + .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) + .sum(); + + return totalScore; + } + catch (Exception e) { + log.error(" Error parsing criteria JSON: {}", e.getMessage()); + return 0; + } + } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 4902cc57..24ce6d55 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1899,7 +1899,7 @@ public class ApplicationEvaluationDao { application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); - emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); +// emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 3988b35a..25b54319 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -249,7 +249,7 @@ public class EmailNotificationDao { sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,amendmentRequest.getId()); } - public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { + public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index b6fd00b3..041ec85a 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -15,7 +15,8 @@ public enum ApplicationStatusTypeEnum { EVALUATION("EVALUATION"), APPOINTMENT("APPOINTMENT"), NDG("NDG"), - ADMISSIBLE("ADMISSIBLE"); + ADMISSIBLE("ADMISSIBLE"), + TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java index 415f1dd2..479912d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java @@ -8,7 +8,7 @@ public enum EmailScenarioTypeEnum { APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"), APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"), APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"), - APPLICATION_APPROVED("APPLICATION_APPROVED"), + APPLICATION_ADMISSIBLE("APPLICATION_ADMISSIBLE"), USER_CREATION("USER_CREATION"), PASSWORD_RESET_REQUEST("PASSWORD_RESET_REQUEST"), APPLICATION_REJECTED("APPLICATION_REJECTED"); 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 e4232f22..5f3bbf66 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 @@ -2532,4 +2532,9 @@ newColumnName="appointment_template_id"/> + + + + diff --git a/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql b/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql new file mode 100644 index 00000000..2605b579 --- /dev/null +++ b/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql @@ -0,0 +1,2 @@ + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_ADMISSIBLE' WHERE "type"='ADMISSIBILITY_NOTIFICATION' AND "system"=true ; \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 36970d79..d312160e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -390,7 +390,8 @@ company.document.copied.successfully = Company Document Copied successfully. invalid.expiration.date = Invalid Expiration Date - appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. appointment.not.created = Appointment not created please try again. validation.failed.checklist=Validation failed for checklist. + +insufficient.score.msg = Insufficient score to pass to the technical and economic-financial evaluation diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ce2e539d..67a3921c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -384,3 +384,5 @@ invalid.expiration.date = Data di scadenza non valida appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID del modello di appuntamento. appointment.not.created = Appuntamento non creato, riprova validation.failed.checklist=Convalida fallita per la checklist. + +insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria From 5b8020b3f9adbfd616f1ac92c34bf4450377790f Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 19:26:48 +0530 Subject: [PATCH 40/50] updated code --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 2 +- 1 file changed, 1 insertion(+), 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 e88c0116..de68936a 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 @@ -2532,7 +2532,7 @@ newColumnName="appointment_template_id"/> - + From a22be9dc77b173f186478223752e159ed6ac7629 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 21:59:47 +0530 Subject: [PATCH 41/50] Fixed issue of getAllCompanyDocument Api --- .../net/gepafin/tendermanagement/dao/CompanyDocumentDao.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index 9cee39b6..f43c6a90 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -306,6 +306,8 @@ public class CompanyDocumentDao { return (root, query, builder) -> { Predicate predicate = builder.equal(root.get("companyId"), companyId); + predicate = builder.and(predicate, builder.isFalse(root.get("isDeleted"))); + if (typeEnum != null) { if (typeEnum == CompanyDocumentTypeEnum.COMPANY_DOCUMENT) { // Case 1: Fetch only COMPANY_DOCUMENT type documents for the given company From e3faef9c59e646d9997a556c60e79213d39ff643 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 28 Feb 2025 11:42:11 +0530 Subject: [PATCH 42/50] Updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 87398d17..c495d1d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -593,6 +593,8 @@ public class CallDao { if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); + callRepository.save(callEntity); isEndDateUpdated = true; } } @@ -604,6 +606,8 @@ public class CallDao { if (!requestEndTime.equals(storedEndTime)) { setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); + callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); + callRepository.save(callEntity); isEndTimeUpdated = true; } } From 6c818d299a5738e29f0625f58e32177f0c48dceb Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 28 Feb 2025 11:42:48 +0530 Subject: [PATCH 43/50] Updated code for date filter in pagination --- .../tendermanagement/dao/ApplicationDao.java | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 87f81625..eb17503f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -57,6 +57,7 @@ import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; @@ -1704,15 +1705,44 @@ public class ApplicationDao { private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - LocalDateTime testDateTime = DateTimeUtil.parseStringToLocalDateTime(value.toString()); + // Convert input string: Replace 'T' with space + String formattedValue = value.toString().replace("T", " "); + + // Handle timezones and UTC (`Z` or `+HH:mm`) + if (formattedValue.contains("Z") || formattedValue.matches(".*[+-]\\d{2}:\\d{2}$")) { + OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + formattedValue = offsetDateTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); + } + + // Check if more than 3 decimal places exist + if (formattedValue.contains(".")) { + int dotIndex = formattedValue.indexOf("."); + if (formattedValue.length() > dotIndex + 4) { + formattedValue = formattedValue.substring(0, dotIndex + 4); // Keep only 3 decimals + } + } else { + formattedValue += ".000"; // Ensure 3 decimals + } + + // Define correct date-time format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + // Parse the formatted value into LocalDateTime + LocalDateTime dateTimeValue = LocalDateTime.parse(formattedValue, formatter); + + // Extract only the date portion + LocalDate dateValue = dateTimeValue.toLocalDate(); + + // Convert database field to LocalDate for date-only comparison + Expression dateField = criteriaBuilder.function("DATE", LocalDate.class, fieldPath); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); - switch (mode) { -// case DATEIS -> predicates.add(criteriaBuilder.equal(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue)); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue)); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); } } } From f24df88f64b7ca212381f38cd44ecfd2ae7fb277 Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 28 Feb 2025 18:03:18 +0530 Subject: [PATCH 44/50] Fixed issue related to amendment documents in evaluation --- .../dao/ApplicationEvaluationDao.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 24ce6d55..e07a65d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -206,23 +206,27 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - if (amendmentDetails != null) { - if (amendmentDetails.getAmendmentDocuments() != null) { - List documentResponseBeans = Arrays.stream(amendmentDetails.getAmendmentDocuments().split(",")) - .map(String::trim) - .filter(id -> !id.isEmpty()) - .map(documentId -> applicationAmendmentRequestDao.createDocumentResponseBean(documentId)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + if (StringUtils.isNotBlank(amendmentDocument)) { + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); + if (amendmentDetails != null) { + if (StringUtils.isNotBlank(amendmentDetails.getAmendmentDocuments())) { + List documentResponseBeans = Arrays.stream(amendmentDetails.getAmendmentDocuments().split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .map(documentId -> applicationAmendmentRequestDao.createDocumentResponseBean(documentId)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); + } + + amendmentDocumentResponseBean.setFieldId("amend_" + applicationAmendmentRequestEntity.getId()); + amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } - amendmentDocumentResponseBean.setFieldId("amend_" + applicationAmendmentRequestEntity.getId()); - amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); - amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); - amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } + List amendmentFormFields = Utils.convertJsonStringToList(formField, AmendmentFormField.class); if (amendmentFormFields != null) { for (AmendmentFormField amendmentFormField : amendmentFormFields) { From a0db6e8f20a0b6dd5b4e464a27bd6d71dea6a643 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 3 Mar 2025 13:10:04 +0530 Subject: [PATCH 45/50] Updated code --- .../web/rest/api/errors/GlobalExceptionHandler.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index 8b431b54..e6ee9234 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -25,6 +25,7 @@ import org.springframework.security.authorization.AuthorizationDeniedException; import org.springframework.security.core.AuthenticationException; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; +import org.springframework.web.servlet.resource.NoResourceFoundException; @ControllerAdvice public class GlobalExceptionHandler { @@ -49,6 +50,7 @@ public class GlobalExceptionHandler { return new Response<>(ex.getErrors(), ex.getStatus(), ex.getMessage()); } + @ResponseStatus(value = HttpStatus.NOT_FOUND) @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { log.error(ex.getMessage()); @@ -178,5 +180,14 @@ public class GlobalExceptionHandler { String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); return Utils.convertIntoJson(exceptionString); } - + + @ResponseStatus(value = HttpStatus.NOT_FOUND) + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity> handlNoeResourceNotFoundException(NoResourceFoundException ex) { + log.error(ex.getMessage()); +// log.error(ex.getLocalizedMessage(), ex); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, ex.getMessage())); + } + } From 507447b4e42cbebd11b93d7697fa9a0a919efa94 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Mar 2025 14:48:04 +0530 Subject: [PATCH 46/50] updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c495d1d5..c34b32aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -612,11 +612,15 @@ public class CallDao { } } if (isEndDateUpdated || isEndTimeUpdated) { + loggingUtil.logUserAction(UserActionRequest.builder() .request(request) .actionType(UserActionLogsEnum.UPDATE) .actionContext(UserActionContextEnum.UPDATE_CALL_END_DATE_AND_TIME) .build()); + + /** This code is responsible for adding a version history log for the "update call end date and time" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); } // setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); From d64779ae382c9b1982d5b7a09a2a8ff61789ed13 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Mar 2025 14:49:03 +0530 Subject: [PATCH 47/50] Fixed issue of fileselect --- .../tendermanagement/dao/ApplicationDao.java | 9 +++++---- .../resources/db/changelog/db.changelog-1.0.0.xml | 11 +++++++++++ .../db/dump/update_form_field_data_03-03-2025.sql | 13 +++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/dump/update_form_field_data_03-03-2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index eb17503f..62289ed7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -277,7 +277,8 @@ public class ApplicationDao { for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) { Optional fileUploadContent = contentResponseBeans.stream() - .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) && + .filter(contentResponseBean -> ("fileupload".equals(contentResponseBean.getName()) || + "fileselect".equals(contentResponseBean.getName())) && contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId())) .findFirst(); @@ -613,7 +614,7 @@ public class ApplicationDao { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean : contentResponseBeans) { - if (Boolean.FALSE.equals(contentResponseBean.getName().equals("fileupload"))) { + if (Boolean.FALSE.equals(contentResponseBean.getName().equals("fileupload") || contentResponseBean.getName().equals("fileselect"))) { return; } } @@ -669,7 +670,7 @@ public class ApplicationDao { // List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); List contentResponseBeans=formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean:contentResponseBeans){ - if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))) { + if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload")) || Boolean.TRUE.equals(contentResponseBean.getName().equals("fileselect"))) { if (contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { Object fieldValueObject = applicationFormFieldRequestBean.getFieldValue(); if (fieldValueObject instanceof String) { @@ -1405,7 +1406,7 @@ public class ApplicationDao { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); - contentResponseBeans.stream().filter(content -> "fileupload".equals(content.getName())).forEach(content -> { + contentResponseBeans.stream().filter(content -> "fileupload".equals(content.getName()) || "fileselect".equals(content.getName())).forEach(content -> { Optional formField = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( content.getId(), applicationForm.getId(), applicationId); formField.ifPresent(field -> { 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 de68936a..66bf7b3b 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 @@ -2550,5 +2550,16 @@ + + + + select + setval('gepafin_schema.form_field_id_seq', (select + max(id)+1 + from gepafin_schema.form_field), false) + + + diff --git a/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql b/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql new file mode 100644 index 00000000..8f377847 --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql @@ -0,0 +1,13 @@ + +INSERT INTO FORM_FIELD (SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( + 23, + 'fileselect', + 'Caricamento File', + 'Per selezionare di documenti o immagini', + '[{name: "label",value: "Seleziona File"},{ name: "isDelegation", value: false }]', + '{"isRequired":false}', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +); \ No newline at end of file From b4165e38fda045cf36066da17deb4487c7d28539 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 3 Mar 2025 16:00:46 +0530 Subject: [PATCH 48/50] Done ticket GEPAFINBE-179 --- .../repositories/ApplicationRepository.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 6eba956e..3b817314 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -8,8 +8,6 @@ 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; @@ -112,24 +110,31 @@ public interface ApplicationRepository extends JpaRepository findRequestedVsApprovedAmountsPerMonth( - @Param("hubId") Long hubId, - @Param("userId") Long userId, - @Param("userWithCompanyId") Long userWithCompanyId - ); + @Query(value = """ + WITH months AS ( + SELECT TO_CHAR(generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month'), 'Mon') AS month_label, + EXTRACT(YEAR FROM generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month')) AS year_value, + EXTRACT(MONTH FROM generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month')) AS month_value + ) + SELECT m.month_label AS month, + COALESCE(SUM(a.amount_requested), 0) AS totalRequested, + COALESCE(SUM(a.amount_accepted), 0) AS totalApproved + FROM months m + LEFT JOIN {h-schema}application a ON EXTRACT(YEAR FROM a.date_accepted) = m.year_value + AND EXTRACT(MONTH FROM a.date_accepted) = m.month_value + AND a.is_deleted = false + AND a.status = 'APPROVED' + AND a.hub_id = :hubId + AND a.user_id = :userId + AND a.user_with_company_id = :userWithCompanyId + GROUP BY m.month_label, m.year_value, m.month_value + ORDER BY m.year_value, m.month_value + """, nativeQuery = true) + 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 " + @@ -164,4 +169,5 @@ public interface ApplicationRepository extends JpaRepository Date: Tue, 4 Mar 2025 12:32:24 +0530 Subject: [PATCH 49/50] Updated code for changes in evaluation Api --- .../tendermanagement/dao/ApplicationDao.java | 45 ---------------- .../dao/ApplicationEvaluationDao.java | 54 ++++++++++++++++++- .../enums/ApplicationStatusForEvaluation.java | 4 +- 3 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 62289ed7..0b565c89 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -964,14 +964,6 @@ public class ApplicationDao { applicationEntity.setStatus(status.getValue()); log.info("Status updated to DRAFT for applicationId: " + applicationId); } - if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ - applicationEntity.setStatus(status.getValue()); - log.info("Status updated to ADMISSIBLE for applicationId: " + applicationId); - emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(applicationEntity); - } - if(status.equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ - processTechnicalEvaluation(applicationId, applicationEntity, status); - } applicationEntity = applicationRepository.save(applicationEntity); log.info("Application status updated successfully | applicationId: {}, newStatus: {}", applicationId, applicationEntity.getStatus()); @@ -983,43 +975,6 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } - private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusTypeEnum status){ - Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - if (evaluationEntityOpt.isPresent()){ - ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); - String criteriaJson = evaluationEntity.getCriteria(); - if (criteriaJson != null){ - Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); - if (totalScore > 40) { - applicationEntity.setStatus(status.getValue()); - log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); - } - else{ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); - } - } - } - } - - private Integer calculateTotalScore(String criteriaJson){ - try { - ObjectMapper objectMapper = new ObjectMapper(); - // Convert JSON string to List of Maps - List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { - }); - - // Sum all scores (ignoring null scores) - Integer totalScore = criteriaList.stream() - .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) - .sum(); - - return totalScore; - } - catch (Exception e) { - log.error(" Error parsing criteria JSON: {}", e.getMessage()); - return 0; - } - } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index e07a65d2..336db880 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1862,7 +1862,21 @@ public class ApplicationEvaluationDao { // UserEntity userEntity = userService.validateUser(application.getUserId()); // callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId()); ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application); - application.setStatus(newStatus.getValue()); + + + if(newStatus.equals(ApplicationStatusForEvaluation.ADMISSIBLE) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ + application.setStatus(newStatus.getValue()); + log.info("Status updated to ADMISSIBLE for applicationId: " + application.getId()); + emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(application); + } + + if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ + processTechnicalEvaluation(application.getId(), application, newStatus); + } + + if((newStatus.equals(ApplicationStatusForEvaluation.APPROVED) || newStatus.equals(ApplicationStatusForEvaluation.REJECTED)) && application.getStatus().equals(ApplicationStatusTypeEnum.EVALUATION.getValue())) { + application.setStatus(newStatus.getValue()); + } application = applicationRepository.save(application); /** This code is responsible for adding a version history log for the "Update Application" operation. **/ @@ -2423,5 +2437,43 @@ public class ApplicationEvaluationDao { } return false; } + private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusForEvaluation status){ + Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if (evaluationEntityOpt.isPresent()){ + ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); + String criteriaJson = evaluationEntity.getCriteria(); + if (criteriaJson != null){ + Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); + if (totalScore > 40) { + applicationEntity.setStatus(status.getValue()); + log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); + } + else{ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); + } + } + } + } + + private Integer calculateTotalScore(String criteriaJson){ + try { + ObjectMapper objectMapper = new ObjectMapper(); + // Convert JSON string to List of Maps + List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { + }); + + // Sum all scores (ignoring null scores) + Integer totalScore = criteriaList.stream() + .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) + .sum(); + + return totalScore; + } + catch (Exception e) { + log.error(" Error parsing criteria JSON: {}", e.getMessage()); + return 0; + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java index 61c39b8e..f0f6acb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java @@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum ApplicationStatusForEvaluation { APPROVED("APPROVED"), - REJECTED("REJECTED"); + REJECTED("REJECTED"), + ADMISSIBLE("ADMISSIBLE"), + TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); private String value; From a9166ae3fe4d633ab7a462770ba3fd0c3f75b730 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 12:42:50 +0530 Subject: [PATCH 50/50] Updated code for fileselect config in pdf --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 2 +- 1 file changed, 1 insertion(+), 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 0569e28d..68129e98 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -560,7 +560,7 @@ public class PdfDao { } // Process 'fileupload' and 'checkboxes' cases as in the original logic - if (name.equals("fileupload")) { + if (name.equals("fileupload") || name.equals("fileselect")) { if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { List documentList = (List) fieldValue; List names = documentList.stream()