diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 05d0e343..4a1d083a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -234,6 +234,13 @@ public class GepafinConstant { public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; public static final String CANNOT_CREATE_BENEFICIARY_USER="cannot.create.beneficiary.user"; + public static final String APPLICATION_ASSIGNED= "application.assigned.success.msg"; + public static final String APPLICATION_ALREADY_ASSIGNED = "application.already.assigned.msg"; + public static final String ASSIGNED_APPLICATION_NOT_FOUND_MSG="aasigned.application.not.found"; + public static final String DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.deleted.success"; + public static final String GET_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.get.success"; + public static final String ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG = "assigned.application.update.successfully"; + public static final String HUB_CREATE_SUCCESS = "hub_create_success"; public static final String HUB_UPDATE_SUCCESS = "hub_update_success"; public static final String HUB_GET_SUCCESS = "hub_get_success"; @@ -242,6 +249,5 @@ public class GepafinConstant { public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; - public static final String APPLICATION_ALREADY_ASSIGNED="application.already.assigned"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e358e6e6..7e9eaa6e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -283,11 +283,11 @@ public class ApplicationDao { // return applicationResponses; // } - public List getAllApplications(UserEntity userEntity, Long callId, Long companyId) { + public List getAllApplications(UserEntity userEntity, Long callId, Long companyId,String status) { log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - Specification spec = search(userEntity.getId(), callId, companyId); + Specification spec = search(userEntity.getId(), callId, companyId,status); List applicationEntities = applicationRepository.findAll(spec); @@ -297,7 +297,7 @@ public class ApplicationDao { } - private Specification search(Long userId, Long callId, Long companyId) { + private Specification search(Long userId, Long callId, Long companyId,String status) { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); @@ -310,6 +310,10 @@ public class ApplicationDao { if (companyId != null) { predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId)); } + if (status != null) { + predicate = builder.and(predicate, builder.equal(root.get("status"), status)); + } + return predicate; }; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java new file mode 100644 index 00000000..5f555ac3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -0,0 +1,147 @@ +package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.Predicate; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +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.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.Utils.log; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class AssignedApplicationsDao { + + @Autowired + ApplicationService applicationService; + + @Autowired + AssignedApplicationsRepository assignedApplicationsRepository; + + @Autowired + UserService userService; + + public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ + log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); + + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + if(assignedApplications!=null){ + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); + } + ApplicationEntity application = applicationService.validateApplication(applicationId); + UserEntity user = userService.validateUser(userId); + AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); + + log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); + return assignApplicationToInstructorResponse; + } + + public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ + AssignedApplicationsEntity assignApplication= new AssignedApplicationsEntity(); + assignApplication.setApplication(application); + assignApplication.setAssignedBy(assignedByUser.getId()); + assignApplication.setUserId(userId); + assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + assignApplication.setNote(assignedApplicationsRequest.getNote()); + assignApplication.setIsDeleted(false); + assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication); + return assignedApplicationsEntity; + + } + public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity){ + AssignedApplicationsEntity assignedApplication= assignedApplicationsRepository.save(assignedApplicationsEntity); + return assignedApplication; + } + + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application, AssignedApplicationsRequest assignedApplicationsRequest){ + AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse(); + assignedApplicationsResponse.setId(application.getId()); + assignedApplicationsResponse.setApplicationId(application.getApplication().getId()); + assignedApplicationsResponse.setAssignedBy(application.getAssignedBy()); + assignedApplicationsResponse.setUserId(application.getUserId()); + assignedApplicationsResponse.setCreatedDate(application.getCreatedDate()); + assignedApplicationsResponse.setUpdatedDate(application.getUpdatedDate()); + assignedApplicationsResponse.setNote(application.getNote()); + assignedApplicationsResponse.setStatus(AssignedApplicationEnum.valueOf(application.getStatus())); + assignedApplicationsResponse.setAssignedAt(application.getAssignedAt()); + return assignedApplicationsResponse; + } + + public AssignedApplicationsEntity validateAssignedApplication(Long id){ + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + return assignedApplication; + } + + public void deleteById(Long id) { + log.info("Deleting assigned application with ID: {}", id); + AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id); + assignedApplicationsEntity.setIsDeleted(true); + assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); + log.info("Assigned Application deleted with ID: {}", id); + } + + public List getAllAssignedApplications(Long userId){ + Specification spec = search(userId); + List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); + return assignedApplicationsEntityList.stream() + .map(entity -> convertEntityToResponse(entity, new AssignedApplicationsRequest())) + .collect(Collectors.toList()); + } + private Specification search(Long userId) { + return (root, query, builder) -> { + Predicate predicate = builder.isFalse(root.get("isDeleted")); + if (userId != null) { + predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + } + return predicate; + }; + } + + + public AssignedApplicationsResponse updateAssignedApplication( + Long id, AssignedApplicationsRequest updateRequest, UserEntity updatedByUser) { + + log.info("Updating assigned application with ID: {}", id); + AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); + + setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); + setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); + setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); + + existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + + AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); + AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment, updateRequest); + log.info("Assigned application updated successfully: {}", response); + return response; + } + + public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + log.info("Fetching assigned application with ID: {}", id); + AssignedApplicationsEntity assignedApplication = validateAssignedApplication(id); + AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication, new AssignedApplicationsRequest()); + log.info("Assigned application fetched successfully: {}", response); + return response; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c4fc17ad..ec6ef678 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -246,7 +246,7 @@ public class CallDao { } List existingDocuments = documentRepository - .findBySourceIdAndTypeAndIsDeletedFalse(sourceId, documentType.getValue()); + .findBySourceIdAndSourceAndTypeAndIsDeletedFalse(sourceId, DocumentSourceTypeEnum.CALL.getValue(), documentType.getValue()); List incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0) .collect(Collectors.toList()); @@ -267,7 +267,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndIsDeletedFalse(documentReq.getId(),sourceId) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; @@ -622,10 +622,10 @@ public class CallDao { } private CallResponse getCallResponseBean(CallEntity callEntity) { - List documentEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.DOCUMENT.getValue()); - List imageEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.IMAGES.getValue()); + List documentEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(),DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.DOCUMENT.getValue()); + List imageEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.IMAGES.getValue()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java new file mode 100644 index 00000000..bd26f527 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Entity +@Data +@Table(name = "assigned_applications") + +public class AssignedApplicationsEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "APPLICATION_ID") + private ApplicationEntity application; + + @Column(name = "USER_ID") + private Long userId; + + @Column(name = "ASSIGNED_BY") + private Long assignedBy; + + @Column(name = "STATUS") + private String status; + + @Column(name = "NOTE") + private String note; + + @Column(name="IS_DELETED") + private Boolean isDeleted=false; + + @Column(nullable = false) + private LocalDateTime assignedAt; +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java new file mode 100644 index 00000000..e0cba98f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum AssignedApplicationEnum { + ASSIGNED("ASSIGNED"), + APPROVED("APPROVED"), + REJECTED("REJECTED"); + + + private final String value; + + AssignedApplicationEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java new file mode 100644 index 00000000..ef4cd3c3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; + +@Data +public class AssignedApplicationsRequest { + private String note; + private AssignedApplicationEnum status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java new file mode 100644 index 00000000..8714d94c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.time.LocalDateTime; + +@Data +public class AssignedApplicationsResponse extends BaseBean { + private Long applicationId; + private Long userId; + private Long assignedBy; + private AssignedApplicationEnum status; + private String note; + private LocalDateTime assignedAt; +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java new file mode 100644 index 00000000..076b93a9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; +import java.util.Optional; + +@Repository +public interface AssignedApplicationsRepository extends JpaRepository, JpaSpecificationExecutor{ + Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); + Optional findByIdAndIsDeletedFalse(Long id); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 1543def3..4f621d38 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -15,12 +15,15 @@ public interface DocumentRepository extends JpaRepository @Query("SELECT d FROM DocumentEntity d WHERE d.id = :id AND d.isDeleted = false") Optional findById(@Param("id") Long id); - List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); +// List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); - Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); +// Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); List findBySource(String source); + List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); + Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index b17ead39..c9a65fef 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -22,7 +22,7 @@ public interface ApplicationService { ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request,Long callId, Long companyId); + List getAllApplications(HttpServletRequest request,Long callId, Long companyId,String status); void deleteApplication(HttpServletRequest request, Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java new file mode 100644 index 00000000..2e211916 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; + +import java.util.List; + +public interface AssignedApplicationsService { + + AssignedApplicationsResponse createAssignedApplications( + HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest); + + void deleteApplication(HttpServletRequest request, Long id); + + List getAllAssignedApplications(Long userId); + AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest assignedApplicationsRequest); + AssignedApplicationsResponse getAssignedApplicationById(Long id); +} 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 9324a3e5..e8e8f1f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -85,12 +85,12 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request, Long callId, Long companyId) { + public List getAllApplications(HttpServletRequest request, Long callId, Long companyId , String status) { UserEntity userEntity = validator.validateUser(request); if (companyId != null) { validator.validateUserWithCompany(request, companyId); } - return applicationDao.getAllApplications(userEntity, callId, companyId); + return applicationDao.getAllApplications(userEntity, callId, companyId , status); } @Override @Transactional(rollbackFor = Exception.class) @@ -116,4 +116,6 @@ public class ApplicationServiceImpl implements ApplicationService { return applicationDao.validateApplication(request, applicationId); } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java new file mode 100644 index 00000000..00733f07 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.AssignedApplicationsDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.service.AssignedApplicationsService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class AssignedApplicationsServiceImpl implements AssignedApplicationsService { + + @Autowired + private Validator validator; + + @Autowired + private AssignedApplicationsDao assignedApplicationsDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public AssignedApplicationsResponse createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { + UserEntity assignedByUser= validator.validateUser(request); + return assignedApplicationsDao.createAssignedApplications(applicationId,userId,assignedByUser, assignedApplicationsRequest); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteApplication(HttpServletRequest request, Long id) { + assignedApplicationsDao.deleteById(id); + } + + @Override + @Transactional(readOnly = true) + public List getAllAssignedApplications(Long userId) { + return assignedApplicationsDao.getAllAssignedApplications(userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id , AssignedApplicationsRequest updatedAssignedApplicationRequest) { + UserEntity updatedByUser= validator.validateUser(request); + return assignedApplicationsDao.updateAssignedApplication(id,updatedAssignedApplicationRequest,updatedByUser); + } + + @Override + @Transactional(readOnly = true) + public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + return assignedApplicationsDao.getAssignedApplicationById(id); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 01ee7943..09563378 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -113,7 +113,7 @@ public class Validator { public CallEntity validateUserWithCall(UserEntity user, Long callId) { CallEntity callEntity = callService.validateCall(callId); - if(user.getHub().getId().equals(callEntity.getHub().getId())) { + if(Boolean.FALSE.equals(user.getHub().getId().equals(callEntity.getHub().getId()))) { throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } return callEntity; 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 05ad1ba4..fcfbe2ff 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 @@ -71,7 +71,8 @@ public interface ApplicationApi { @GetMapping(value = "", produces = "application/json") ResponseEntity>> getAllApplications(HttpServletRequest request, @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, - @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId); + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, + @Parameter(description = "Application status" ,required = false) @RequestParam(value = "status",required = false)String status); @Operation(summary = "Api to delete application", responses = { 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 new file mode 100644 index 00000000..dfbbfc37 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -0,0 +1,101 @@ +package net.gepafin.tendermanagement.web.rest.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +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.*; + +import java.util.List; + +@Validated +public interface AssignedApplicationsApi { + + @Operation(summary = "Api to assign a application to preInstructor", + 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 = "/application/{applicationId}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createAssignedApplications( + HttpServletRequest request, + @Parameter(description = "ID of the application", required = true) @PathVariable Long applicationId, + @Parameter(description = "The User ID", required = true) @RequestParam("userId") Long userId, + @Valid @RequestBody AssignedApplicationsRequest assignedApplicationsRequest + ); + + @Operation(summary = "Api to delete assigned application", + 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}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + ResponseEntity> deleteAssignedApplication(HttpServletRequest request, + @Parameter(description = "The assigned application id", required = true) @PathVariable("id") Long id); + + @Operation(summary = "Api to get all assigned applications", + 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>> getAllAssignedApplications(@Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); + + @Operation(summary = "Api to update assigned application", + 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 = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> updateAssignedApplication(HttpServletRequest request, + @Parameter(description = "The Assigned Application id", required = true) @PathVariable("id") Long id, + @Parameter(description = "Assigned Application request object", required = true) @Valid @RequestBody AssignedApplicationsRequest assignedApplicationsRequest); + + @Operation(summary = "Api to get an assigned application 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> getAssignedApplicationById(@Parameter(description = "The assigned application id", required = true) @PathVariable(value = "id", required = true) Long id); + + + +} 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 4880a059..71dc2421 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 @@ -76,8 +76,8 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId) { - List applications = applicationService.getAllApplications(request, callId, companyId); + public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId, String status) { + List applications = applicationService.getAllApplications(request, callId, companyId,status); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_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 new file mode 100644 index 00000000..9c4f0ad4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -0,0 +1,72 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.AssignedApplicationsService; +import net.gepafin.tendermanagement.web.rest.api.AssignedApplicationsApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/assignedApplication}") +@Log4j2 +public class AssignedApplicationsController implements AssignedApplicationsApi { + + @Autowired + AssignedApplicationsService assignedApplicationsService; + + @Override + public ResponseEntity> createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { + log.info("Assigning Application To PreInstructor"); + AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request,applicationId,userId, assignedApplicationsRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(responseData, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_ASSIGNED))); + } + + @Override + public ResponseEntity> deleteAssignedApplication(HttpServletRequest request, Long id) { + log.info("Delete Assigned Application - Assigned Application ID: {}", id); + assignedApplicationsService.deleteApplication(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getAllAssignedApplications(Long userId) { + log.info("Get All Assigned Applications"); + List applications = assignedApplicationsService.getAllAssignedApplications(userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updateAssignedApplicationRequest) { + log.info("Update Assigned Application"); + AssignedApplicationsResponse updateAssignedApplication = assignedApplicationsService.updateAssignedApplication(request, id, updateAssignedApplicationRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(updateAssignedApplication, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG))); + } + + @Override + public ResponseEntity> getAssignedApplicationById(Long id) { + log.info("Get Assigned Applications By Id"); + AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + +} + + 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 ae704451..5df3a2b7 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 @@ -1212,6 +1212,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index cf6f0f92..2b73f07a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -265,7 +265,12 @@ hub_delete_success=Hub deleted successfully hub_not_found=Hub not found application.not.in.draft.status=Application is not in DRAFT status. -application.already.assigned=Application is already assigned. +application.assigned.success.msg = Application assigned successfully. +application.already.assigned.msg = Application is already assigned. +aasigned.application.not.found=Assigned Application not found with the given ID. +assigned.application.deleted.success=Assigned Application successfully deleted. +assigned.application.get.success=Assigned Application details fetched successfully. +assigned.application.update.successfully=Assigned Application updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 1dbb12f9..019057e7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -253,6 +253,13 @@ cannot.create.beneficiary.user = La creazione di un utente beneficiario non � evaluationCriteria.invalid=Questo criterio di valutazione non appartiene alla chiamata corrente. +application.assigned.success.msg =Domanda assegnata con successo +application.already.assigned.msg =La domanda � gi� assegnata +aasigned.application.not.found = Applicazione assegnata non trovata con l'ID specificato. +assigned.application.deleted.success =Applicazione assegnata eliminata con successo. +assigned.application.get.success =Dettagli dell'applicazione assegnata recuperati correttamente. +assigned.application.update.successfully = Applicazione assegnata aggiornata correttamente. + # Hub Messages hub_create_success=Hub creato con successo hub_update_success=Hub aggiornato con successo @@ -261,5 +268,4 @@ hub_get_all_success=Hub recuperati con successo hub_delete_success=Hub eliminato con successo hub_not_found=Hub non trovato -application.not.in.draft.status=La domanda non è in stato DRAFT. -application.already.assigned=L'applicazione è già assegnata. \ No newline at end of file +application.not.in.draft.status=La domanda non � in stato DRAFT.