diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 3c5ed0fb..14f2b1bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -110,7 +110,7 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf).orElse(null); + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId()).orElse(null); if (userEntity == null) { redirectUrl += "/registration?temp_token=" + token; } else { diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 525849b7..bdcf563f 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -248,6 +248,7 @@ public class GepafinConstant { public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; + public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; public static final String GET_ERROR_S3 = "get.error.s3"; public static final String ADDED_S3_PATH_STRUCTURE ="added.s3.path.structure"; @@ -258,5 +259,6 @@ public class GepafinConstant { public static final String S3_PATH_CONFIG_UPDATE_MSG ="s3.path.config.updated.successfully"; public static final String S3_PATH_CONFIG_DUPLICATE_TYPE_ALREADY_EXIST ="s3.path.config.already.exist."; public static final String S3_PATH_GENERATION_ERROR_MSG ="s3.path.config.already.exist."; + public static final String INVALID_APPLICATION_STATUS = "invalid.application.status"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a9162986..2332a194 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -138,12 +138,12 @@ public class ApplicationDao { validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); - if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); + if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); - createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity,formEntity); + createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity, formEntity); return getApplicationById(applicationEntity.getId(),formEntity.getId()); } public void validateDelegation(UserEntity user, CompanyEntity company) { @@ -179,6 +179,7 @@ public class ApplicationDao { entity.setUserId(user.getId()); entity.setCompany(companyEntity); entity.setCall(call); + entity.setHubId(call.getHub().getId()); entity.setIsDeleted(false); entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); return entity; @@ -291,7 +292,7 @@ public class ApplicationDao { log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - Specification spec = search(userEntity.getId(), callId, companyId,status); + Specification spec = search(userEntity, callId, companyId,status); List applicationEntities = applicationRepository.findAll(spec); @@ -301,12 +302,12 @@ public class ApplicationDao { } - private Specification search(Long userId, Long callId, Long companyId,String status) { + private Specification search(UserEntity userEntity, Long callId, Long companyId,String status) { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); if (isBeneficiary) { - predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + predicate = builder.and(predicate, builder.equal(root.get("userId"), userEntity.getId())); } if (callId != null) { predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId)); @@ -317,7 +318,7 @@ public class ApplicationDao { if (status != null) { predicate = builder.and(predicate, builder.equal(root.get("status"), status)); } - + predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); return predicate; }; } @@ -603,25 +604,8 @@ public class ApplicationDao { if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(status.getValue()))){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } - if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) { - callService.validatePublishedCall(applicationEntity.getCall().getId()); -// CallEntity callEntity = applicationEntity.getCall(); -// Long initialFormId = callEntity.getInitialForm(); -// Long finalFormId = callEntity.getFinalForm(); -//// if (initialFormId == null || finalFormId == null) { -//// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); -//// } -// ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId); -// ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId); -// if (initialApplicationForm == null || finalApplicationForm == null) { -// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); -// } - List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); - Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList); - Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity); - if (totalSteps.intValue() != completedSteps) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); - } + if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { + callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); Long protocolNumber = getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = createProtocolEntity(applicationEntity,protocolNumber, userEntity.getHub().getId()); applicationEntity.setProtocol(protocolEntity); @@ -630,11 +614,10 @@ public class ApplicationDao { applicationEntity = saveApplicationEntity(applicationEntity); sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); - } else { applicationEntity.setStatus(status.getValue()); applicationEntity = saveApplicationEntity(applicationEntity); } - + return getApplicationResponse(applicationEntity); } @@ -806,8 +789,9 @@ public class ApplicationDao { ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); if (applicationSignedDocument != null) { - applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); - applicationSignedDocumentRepository.save(applicationSignedDocument); + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); +// applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); +// applicationSignedDocumentRepository.save(applicationSignedDocument); } UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, applicationEntity.getCall().getId(), applicationId); @@ -817,6 +801,8 @@ public class ApplicationDao { applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); + applicationEntity.setStatus(ApplicationStatusTypeEnum.READY.getValue()); + applicationRepository.save(applicationEntity); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForUserSignedDocument(MultipartFile file, Long callId, Long applicationId) { @@ -888,4 +874,24 @@ public class ApplicationDao { applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); } + + public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); + } + List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); + Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList); + Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity); + if (totalSteps.intValue() != completedSteps) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); + } + + applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue()); + applicationEntity = saveApplicationEntity(applicationEntity); + return getApplicationResponse(applicationEntity); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 5f555ac3..f04b5e98 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -1,17 +1,21 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.Predicate; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; 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.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; @@ -30,13 +34,19 @@ import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; public class AssignedApplicationsDao { @Autowired - ApplicationService applicationService; + private ApplicationService applicationService; @Autowired - AssignedApplicationsRepository assignedApplicationsRepository; + private ApplicationRepository applicationRepository; @Autowired - UserService userService; + private AssignedApplicationsRepository assignedApplicationsRepository; + + @Autowired + private UserService userService; + + @Autowired + private Validator validator; public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); @@ -46,9 +56,19 @@ public class AssignedApplicationsDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); + + + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.getValue().equals(application.getStatus()))) { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) + ); + } + application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); + applicationRepository.save(application); UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); - AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); return assignApplicationToInstructorResponse; @@ -59,7 +79,10 @@ public class AssignedApplicationsDao { assignApplication.setApplication(application); assignApplication.setAssignedBy(assignedByUser.getId()); assignApplication.setUserId(userId); - assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + assignApplication.setStatus(AssignedApplicationEnum.ASSIGNED.getValue()); + if(assignedApplicationsRequest.getStatus() != null) { + assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + } assignApplication.setNote(assignedApplicationsRequest.getNote()); assignApplication.setIsDeleted(false); assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -72,17 +95,44 @@ public class AssignedApplicationsDao { return assignedApplication; } - public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application, AssignedApplicationsRequest assignedApplicationsRequest){ + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications){ 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()); + assignedApplicationsResponse.setId(assignedApplications.getId()); + assignedApplicationsResponse.setApplicationId(assignedApplications.getApplication().getId()); + + ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); + String callName = application.getCall() != null ? application.getCall().getName() : ""; + LocalDateTime callEndDate = application.getCall().getEndDate(); + LocalDateTime callStartDate = application.getCall().getStartDate(); + + Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) + ? application.getProtocol().getProtocolNumber() + : 0; + LocalDateTime submissionDate = application.getSubmissionDate(); + UserEntity userEntity = userService.validateUser(application.getUserId()); + + String firstName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getFirstName() : null; + String lastName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getLastName() : null; + + String beneficiaryName = (firstName != null && !firstName.isBlank() ? firstName : "") + + (lastName != null && !lastName.isBlank() ? " " + lastName : ""); + + beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; + + assignedApplicationsResponse.setAssignedBy(assignedApplications.getAssignedBy()); + assignedApplicationsResponse.setUserId(assignedApplications.getUserId()); + assignedApplicationsResponse.setCreatedDate(assignedApplications.getCreatedDate()); + assignedApplicationsResponse.setUpdatedDate(assignedApplications.getUpdatedDate()); + assignedApplicationsResponse.setNote(assignedApplications.getNote()); + assignedApplicationsResponse.setStatus(AssignedApplicationEnum.valueOf(assignedApplications.getStatus())); + assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt()); + assignedApplicationsResponse.setProtocolNumber(protocolNumber); + assignedApplicationsResponse.setCallName(callName); + assignedApplicationsResponse.setBeneficiaryName(beneficiaryName); + assignedApplicationsResponse.setSubmissionDate(submissionDate); + assignedApplicationsResponse.setCallEndDate(callEndDate); + assignedApplicationsResponse.setCallStartDate(callStartDate); + return assignedApplicationsResponse; } @@ -92,38 +142,47 @@ public class AssignedApplicationsDao { return assignedApplication; } - public void deleteById(Long id) { + public void deleteById(HttpServletRequest request, Long id) { log.info("Deleting assigned application with ID: {}", id); AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id); + validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); assignedApplicationsEntity.setIsDeleted(true); assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); log.info("Assigned Application deleted with ID: {}", id); } - public List getAllAssignedApplications(Long userId){ - Specification spec = search(userId); + public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + UserEntity user = validator.validateUser(request); + if(validator.checkIsPreInstructor() && userId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); + } + if(userId != null) { + validator.validatePreInstructor(request, userId); + } + Specification spec = search(user.getHub().getId() ,userId); List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); return assignedApplicationsEntityList.stream() - .map(entity -> convertEntityToResponse(entity, new AssignedApplicationsRequest())) + .map(entity -> convertEntityToResponse(entity)) .collect(Collectors.toList()); } - private Specification search(Long userId) { + private Specification search(Long hubId, 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)); } + predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), hubId)); return predicate; }; } - public AssignedApplicationsResponse updateAssignedApplication( - Long id, AssignedApplicationsRequest updateRequest, UserEntity updatedByUser) { - + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, + Long id, AssignedApplicationsRequest updateRequest) { + UserEntity updatedByUser = validator.validateUser(request); log.info("Updating assigned application with ID: {}", id); AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); - + validator.validatePreInstructor(request, existingAssignment.getUserId()); setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); @@ -131,15 +190,16 @@ public class AssignedApplicationsDao { existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); - AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment, updateRequest); + AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment); log.info("Assigned application updated successfully: {}", response); return response; } - public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + public AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id) { log.info("Fetching assigned application with ID: {}", id); AssignedApplicationsEntity assignedApplication = validateAssignedApplication(id); - AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication, new AssignedApplicationsRequest()); + validator.validatePreInstructor(request, assignedApplication.getUserId()); + AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication); log.info("Assigned application fetched successfully: {}", response); return response; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java index 13b0f719..285702f1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java @@ -5,13 +5,11 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryPreferredCallEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; import net.gepafin.tendermanagement.repositories.BeneficiaryPreferredCallRepository; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -19,10 +17,11 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import jakarta.servlet.http.HttpServletRequest; + import java.util.List; import java.util.stream.Collectors; -import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component public class BeneficiaryPreferredCallDao { @@ -31,11 +30,14 @@ public class BeneficiaryPreferredCallDao { @Autowired private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository; + @Autowired - private UserService userService; + private Validator validator; - public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(BeneficiaryPreferredCallReq request,UserEntity user) { + + public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request,UserEntity user) { log.info("Creating new beneficiary preferred call with details: {}", request); + validator.validateUserWithCompany(httpServletRequest, request.getCompanyId()); BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request,user); entity = beneficiaryPreferredCallRepository.save(entity); log.info("Beneficiary preferred call created with ID: {}", entity.getId()); @@ -44,9 +46,8 @@ public class BeneficiaryPreferredCallDao { private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity) { BeneficiaryPreferredCallEntity entity = new BeneficiaryPreferredCallEntity(); - UserEntity user= userService.validateUser(userEntity.getId()); - if (user.getBeneficiary()!=null) { - entity.setBeneficiaryId(user.getBeneficiary().getId()); + if (userEntity.getBeneficiary()!=null) { + entity.setBeneficiaryId(userEntity.getBeneficiary().getId()); } entity.setStatus(BeneficiaryCallStatus.ENABLED.getValue()); entity.setCallId(request.getCallId()); @@ -55,9 +56,10 @@ public class BeneficiaryPreferredCallDao { return entity; } - public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(Long id) { + public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { log.info("Fetching beneficiary preferred call with ID: {}", id); BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); + validator.validateUserId(request, entity.getUserId()); log.info("Beneficiary preferred call found: {}", entity); return convertEntityToResponse(entity); } @@ -74,20 +76,18 @@ public class BeneficiaryPreferredCallDao { // return convertEntityToResponse(existingEntity); // } - private boolean isUserABeneficiary(Long userId) { - UserEntity user=userService.validateUser(userId); - return RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(user.getRoleEntity().getRoleType()); - } - public void deleteBeneficiaryPreferredCallById(Long id) { + public void deleteBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { log.info("Deleting beneficiary preferred call with ID: {}", id); - validateBeneficiaryPreferredCall(id); + BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); + validator.validateUserId(request, entity.getUserId()); beneficiaryPreferredCallRepository.deleteById(id); log.info("Beneficiary preferred call deleted with ID: {}", id); } - public List getAllBeneficiaryPreferredCalls() { + public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) { + UserEntity userEntity = validator.validateUser(request); log.info("Fetching all beneficiary preferred calls"); - List calls = beneficiaryPreferredCallRepository.findAll() + List calls = beneficiaryPreferredCallRepository.findByUserId(userEntity.getId()) .stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 8cee9587..b52aa97b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -230,6 +230,7 @@ public class CallDao { criteriaEntity = new EvaluationCriteriaEntity(); criteriaEntity.setCall(callEntity); criteriaEntity.setLookupData(lookupDataEntity); + criteriaEntity.setScore(0L); criteriaEntity.setIsDeleted(false); } setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore()); @@ -601,6 +602,7 @@ public class CallDao { dates.add(callEntity.getStartDate()); dates.add(callEntity.getEndDate()); callDetailsResponseBean.setDates(dates); + callDetailsResponseBean.setConfidi(callEntity.getConfidi()); callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); @@ -619,6 +621,7 @@ public class CallDao { callDetailsResponseBean.setPhoneNumber(callEntity.getPhoneNumber()); callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return callDetailsResponseBean; } @@ -651,7 +654,7 @@ public class CallDao { if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); } - List calls = callRepository.findByStatusIn(callStatusList); + List calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); return calls.stream() .map(this::convertToCallDetailsResponseBean) .collect(Collectors.toList()); @@ -669,13 +672,13 @@ public class CallDao { callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); return callResponseBean; } - public CallEntity getCallEntityById(Long id){ - CallEntity callEntity=callRepository.findByIdAndStatusNotIn(id,List.of(CallStatusEnum.PUBLISH.getValue())); - if(callEntity==null){ - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); - } - return callEntity; - } +// public CallEntity getCallEntityById(Long id){ +// CallEntity callEntity=callRepository.findByIdAndStatusNotInAndHubId(id, List.of(CallStatusEnum.PUBLISH.getValue())); +// if(callEntity==null){ +// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); +// } +// return callEntity; +// } public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) { CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); @@ -715,9 +718,9 @@ public class CallDao { } } - public CallEntity validatePublishedCall(Long callId) { + public CallEntity validatePublishedCall(Long callId, Long hubId) { CallEntity callEntity= callRepository - .findByIdAndStatus(callId, CallStatusEnum.PUBLISH.getValue()); + .findByIdAndStatusAndHubId(callId, CallStatusEnum.PUBLISH.getValue(), hubId); if(callEntity==null){ throw new ResourceNotFoundException( Status.NOT_FOUND, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 2208962b..84b01021 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -40,7 +40,7 @@ public class CompanyDao { public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) { - CompanyEntity existingCompany = companyRepository.findByVatNumber(companyRequest.getVatNumber()); + CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId()); UserWithCompanyEntity userWithCompanyEntity = null; if (existingCompany != null) { UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId()) @@ -53,8 +53,8 @@ public class CompanyDao { } return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity); } else { - validateCompany(companyRequest); - CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(companyRequest); + validateCompany(userEntity, companyRequest); + CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(userEntity, companyRequest); companyRepository.save(companyEntity); userWithCompanyEntity = createUserWithCompanyRelation(userEntity, companyEntity, companyRequest.getIsLegalRepresentant()); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); @@ -62,7 +62,7 @@ public class CompanyDao { } - private void validateCompany(CompanyRequest companyRequest) { + private void validateCompany(UserEntity userEntity, CompanyRequest companyRequest) { if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail())) && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) { @@ -73,7 +73,7 @@ public class CompanyDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_MANDATORY)); } - if (companyRepository.existsByVatNumber(companyRequest.getVatNumber())) { + if (companyRepository.existsByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_ALREADY_EXISTS)); } @@ -91,7 +91,7 @@ public class CompanyDao { return userWithCompanyRepository.save(userWithCompanyEntity); } - private CompanyEntity convertCompanyRequestToCompanyEntity(CompanyRequest request) { + private CompanyEntity convertCompanyRequestToCompanyEntity(UserEntity userEntity, CompanyRequest request) { CompanyEntity entity = new CompanyEntity(); entity.setCompanyName(request.getCompanyName()); entity.setVatNumber(request.getVatNumber()); @@ -108,6 +108,7 @@ public class CompanyDao { entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setContactName(request.getContactName()); entity.setContactEmail(request.getContactEmail()); + entity.setHub(userEntity.getHub()); return entity; } @@ -186,7 +187,7 @@ public class CompanyDao { public List getCompanyByUserId(Long userId) { UserEntity userEntity = userService.validateUser(userId); List activeCompanyIds = userWithCompanyRepository.findActiveCompanyIdsByUserId(userEntity.getId()); - List companies = companyRepository.findByIdIn(activeCompanyIds); + List companies = companyRepository.findByIdInAndHubId(activeCompanyIds, userEntity.getHub().getId()); return companies.stream().map(companyEntity -> { UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyEntity.getId()); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index a849f67d..c76d14c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -60,7 +60,7 @@ public class DashboardDao { } private void setActiveCalls(Widget1 widget1, UserEntity requestedUserEntity) { - Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); + Long activeCalls = callRepository.countByStatusAndHubId(CallStatusEnum.PUBLISH.getValue(), requestedUserEntity.getHub().getId()); if (activeCalls != null) { widget1.setNumberOfActiveCalls(activeCalls); } @@ -74,27 +74,27 @@ public class DashboardDao { } } - private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUserEntity) { - BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCalls(); + private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUser) { + BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCallsAndHubId(requestedUser.getHub().getId()); widget1.setTotalActiveFinancing(totalActiveFinancing); } private void setSubmittedApplications(Widget1 widget1, UserEntity requestedUserEntity) { - Long submittedApplications = applicationRepository.countSubmittedApplications(); + Long submittedApplications = applicationRepository.countSubmittedApplicationsByHubId(requestedUserEntity.getHub().getId()); if (submittedApplications != null) { widget1.setNumberOfSubmittedApplications(submittedApplications); } } private void setDraftApplications(Widget1 widget1, UserEntity requestedUserEntity) { - Long draftApplications = applicationRepository.countDraftApplications(); + Long draftApplications = applicationRepository.countDraftApplicationsByHubId(requestedUserEntity.getHub().getId()); if (draftApplications != null) { widget1.setNumberOfDraftApplications(draftApplications); } } private void setNumberOfCompanies(Widget1 widget1, UserEntity requestedUserEntity) { - Long numberOfCompanies = companyRepository.countTotalCompanies(); + Long numberOfCompanies = companyRepository.countTotalCompaniesByHubId(requestedUserEntity.getHub().getId()); if (numberOfCompanies != null) { widget1.setNumberOfCompany(numberOfCompanies); } @@ -104,7 +104,7 @@ public class DashboardDao { CompanyEntity company) { BeneficiaryWidgetResponseBean beneficiaryWidgetResponseBean = BeneficiaryWidgetResponseBean.builder() .numberOfApplications(0L).numberOfCalls(0L).numberOfIntegratedDocuments(0L).build(); - Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); + Long activeCalls = callRepository.countByStatusAndHubId(CallStatusEnum.PUBLISH.getValue(), userEntity.getHub().getId()); if (activeCalls != null) { beneficiaryWidgetResponseBean.setNumberOfCalls(activeCalls); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index b8ce98a0..20ae2cca 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CompanyEntity; @@ -32,6 +33,7 @@ import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; 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; @@ -39,7 +41,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component public class DelegationDao { - private static final String DEFAULT_PLACEHOLDER = "____________________"; +// private static final String DEFAULT_PLACEHOLDER = "____________________"; @Autowired private UserService userService; @@ -61,6 +63,9 @@ public class DelegationDao { @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; + + @Autowired + private Validator validator; public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { @@ -93,9 +98,10 @@ public class DelegationDao { return new XWPFDocument(templateStream); } - public ByteArrayOutputStream downloadCompanyDelegation(UserEntity userEntity, Long companyId, CompanyDelegationRequest companyDelegationRequest) { + public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { Map placeholders = getDefaultPlaceholders(); - UserResponseBean user = userService.getUserById(userEntity.getId()); + UserEntity userEntity = validator.validateUser(request); + UserResponseBean user = userService.getUserById(request, userEntity.getId()); CompanyEntity companyEntity = companyDao.validateCompany(companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId); updatePlaceholdersForDelegation(user, companyEntity, placeholders, companyDelegationRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index b865121e..86a7693f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -50,7 +50,10 @@ public class EvaluationCriteriaDao { .validateLookUpData(evaluationCriteriaRequest.getLookUpDataId()); entity.setCall(callEntity); entity.setLookupData(looDataEntity); - entity.setScore(evaluationCriteriaRequest.getScore()); + entity.setScore(0L); + if (evaluationCriteriaRequest.getScore() != null) { + entity.setScore(evaluationCriteriaRequest.getScore()); + } entity = evaluationCriteriaRepository.save(entity); return entity; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java index 509d4843..9ff64040 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean; import net.gepafin.tendermanagement.repositories.LoginAttemptRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -29,7 +30,7 @@ public class LoginAttemptDao { loginAttemptRepository.save(loginAttemptEntity); } - public LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { + public LoginAttemptPageableResponseBean> getLoginAttemptsList(UserEntity userEntity, Integer pageNo, Integer pageLimit) { if (pageLimit == null || pageLimit <= 0) { pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; } @@ -38,7 +39,7 @@ public class LoginAttemptDao { pageNo = GepafinConstant.DEFAULT_PAGE; } - Page page = loginAttemptRepository.findAll(PageRequest.of(pageNo - 1, pageLimit, Sort.by(GepafinConstant.ATTEMPT_DATE).descending())); + Page page = loginAttemptRepository.findByHubId(userEntity.getHub().getId(), PageRequest.of(pageNo - 1, pageLimit, Sort.by(GepafinConstant.ATTEMPT_DATE).descending())); List list = new ArrayList<>(); for (LoginAttemptEntity loginAttemptEntity : page.getContent()) { list.add(loginAttemptEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 6fa9b56a..efdc3798 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -10,11 +10,15 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; //import com.itextpdf.layout.element. @@ -37,6 +41,7 @@ public class PdfDao { @Autowired private Validator validator; + public static final Logger log = LoggerFactory.getLogger(PdfDao.class); public byte[] generatePdf(HttpServletRequest request,Long applicationId) { try { @@ -75,56 +80,11 @@ public class PdfDao { addColoredLines(writer,document,greyColor); document.add(new Paragraph(" ")); - // Application ID section (Centered) -// pageEvent.setTotalPages(writer.getPageNumber()); - String protocolNumber="XX00"; - if(applicationEntity.getProtocol()!=null) { - protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); - } - Paragraph appId = new Paragraph("ID domanda :" +protocolNumber); - appId.setAlignment(Element.ALIGN_RIGHT); - document.add(appId); - - document.add(new Paragraph(" ")); - - addColoredLines(writer,document,greenColor); - document.add(new Paragraph(" ")); - document.add(new Paragraph("\n")); // Add line break -// String companyName= companyEntity.getCompanyName(); -// String vatNumber=companyEntity.getVatNumber(); -// String address=companyEntity.getAddress(); -// // Section: Dati Anagrafici Azienda -// document.add(new Paragraph("Dati Anagrafici Azienda", sectionFont)); -// addLabelValuePair(document, "Codice ATECO", "SEZIONE C “ATTIVITÀ MANUFATTURIERE”", regularFont); -// addLabelValuePair(document, "Ragione Sociale", companyName, regularFont); -// addLabelValuePair(document, "Partita IVA", vatNumber, regularFont); -// addLabelValuePair(document, "Indirizzo sede Legale", address, regularFont); -// -// document.add(new Paragraph("\n")); // Add line break -// -// // Section: Domanda presentata da -// document.add(new Paragraph("Domanda presentata da:", sectionFont)); -// addLabelValuePair(document, "Nome e cognome", userEntity.getBeneficiary().getFirstName()+" "+userEntity.getBeneficiary().getLastName(), regularFont); -// addLabelValuePair(document, "Codice fiscale", userEntity.getBeneficiary().getCodiceFiscale(), regularFont); -// addLabelValuePair(document, "Telefono", userEntity.getBeneficiary().getPhoneNumber(), regularFont); -// addLabelValuePair(document, "Email", userEntity.getBeneficiary().getEmail(), regularFont); -// addLabelValuePair(document, "Con il titolo di", "Rappresentante legale", regularFont); - document.add(new Paragraph(" ")); - ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(request, applicationId, null); for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); document.add(new Paragraph(" ")); // Add line break - List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse); - for (FieldLabelValuePairRequest pair : fieldLabelValuePairRequests) { - String label = pair.getLabel(); - Object value = pair.getValue(); - Integer pages=0; - pages=addLabelValuePair(writer,document, label, value, labelFont,valueFont,call.getName(),pages); - if(pages !=0 ){ -// pageEvent.setTotalPages(writer.getPageNumber()); - } - } + List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse,writer,document); addColoredLines(writer,document,greenColor); document.add(new Paragraph(" ")); // Add line break } @@ -200,15 +160,6 @@ public class PdfDao { addColoredLines(writer,document,greenColor); -// System.out.println(writer.getPageSize()); -// System.out.println(document.getPageSize()); -// System.out.println(document.getPageNumber()); -// System.out.println(writer.getPageNumber()); -// document.setPageCount(100); -// document.setPageCount(writer.getPageNumber()); -// System.out.println(document.getPageNumber()); - - // Close the document document.close(); // Convert to byte array for response @@ -221,12 +172,13 @@ public class PdfDao { return null; } - private Integer addLabelValuePair(PdfWriter writer,Document document, String label, Object value, Font labelFont,Font valueFont,String title,Integer totalPages) throws DocumentException { + private void addLabelValuePair(PdfWriter writer,Document document, String label, Object value, Font labelFont,Font valueFont,ContentResponseBean contentResponseBean) throws DocumentException { // Add label + Map stateFieldMap= new HashMap<>(); + Paragraph labelParagraph = new Paragraph(label, labelFont); document.add(labelParagraph); float leftMargin = 20f; - PdfContentByte canvas = writer.getDirectContent(); // Setting the color and width of the line @@ -240,8 +192,6 @@ public class PdfDao { if (yPos <= 140) { // If xEnd is less than or equal to 200, generate a new page - - totalPages++; document.newPage(); } // Add a gap between the label and value document.add(new Paragraph(" ")); // Adding an empty paragraph for spacing @@ -271,44 +221,13 @@ public class PdfDao { // Finally, add the table to the document document.add(valueTable); - } else { - boolean containsThreeValues = false; // Variable to track if any map contains three keys - List> dataList = (List>) value; // Cast Object to List of Maps - for (Map entry : dataList) { - if (entry.size() == 3) { // Check if the current map has three keys - containsThreeValues = true; // If found, set the variable to true - break; // No need to check further, exit loop - } - } - List> extractedData = new ArrayList<>(); // To hold extracted data - for (Map entry : dataList) { - Map extractedMap = new HashMap<>(); // To hold the current extracted row of data + } + else if (!list.isEmpty() && list.get(0) instanceof Map) { + Object object = value; + String stringvalue = Utils.convertToString(object); + List> fieldValueList = Utils.convertJsonStringIntoJsonList(stringvalue); - List keys = new ArrayList<>(entry.keySet()); // Get all keys in the current map - - // Handle based on the number of keys in the map - if (Boolean.FALSE.equals(containsThreeValues) && keys.size() == 2) { - // Treat the first key as the "key" and second key as the "value" - String heading = (String) entry.get(keys.get(0)); // Get value of first key - String value1 = (String) entry.get(keys.get(1)); // Get value of second key - extractedMap.put(heading,value1); // Store the first key's value as "heading" - } if (Boolean.TRUE.equals(containsThreeValues) ) { - String amount=""; - // Treat the first as number, second as description, third as amount - if(keys.size()==3){ - amount = (String) entry.get(keys.get(2)); // Third key's value - } - String number = (String) entry.get(keys.get(0)); // First key's value - String description = (String) entry.get(keys.get(1)); // Second key's value - - // Store the combined result as a value in the map, with a suitable key - String combinedValue = number + "; " + description + "; " + amount; // Concatenate them as a single value - extractedMap.put("combined", combinedValue); // Store as a single entry, key as "combined" - } - - extractedData.add(extractedMap); // Add each extracted map to the list - } - document=createPdfTable(extractedData,document); + document = createPdfTable(fieldValueList, document, contentResponseBean); } } else { @@ -325,150 +244,89 @@ public class PdfDao { } document.add(new Paragraph("\n")); // Add line break after each value - return totalPages; } - private Document createPdfTable(List> extractedData,Document document) throws DocumentException { - // Create a PdfPTable with 2 columns - PdfPTable table = new PdfPTable(2); // Initial assumption for 2 columns + 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<>(); + + // Populate stateFieldMap from contentResponseBean settings + contentResponseBean.getSettings().stream() + .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .map(SettingResponseBean::getValue) + .filter(Objects::nonNull) // Ensure value is not null + .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map + .map(settingValue -> (Map) settingValue) // Cast to Map + .map(valueMap -> (List>) valueMap.get("stateFieldData")) // Extract stateFieldData list + .filter(Objects::nonNull) // Ensure stateFieldData is not null + .flatMap(List::stream) // Flatten the list of field data maps + .forEach(fieldData -> { + String fieldName = (String) fieldData.get("name"); // Get the name field + String fieldDataValue = (String) fieldData.get("label"); // Get the predefined field + + if (fieldName != null && fieldDataValue != null) { + stateFieldMap.put(fieldName, fieldDataValue); + } + }); + + PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries table.setWidthPercentage(100); // Set table width to 100% table.setTableEvent(new RoundedBorderEvent()); + Font textFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(105, 105, 105)); // Gray text - boolean combinedHeaderAdded = false; // Flag to track if headers for combined have been added - float rowHeight = 50f; // Example row height, adjust as necessary + float rowHeight = 20f; // Example row height float maxTableHeight = 700f; // Maximum height of the table before a page break - float[] columnWidths = {0.7f, 0.3f}; - table.setWidths(columnWidths); + boolean headersAdded = false; // Flag to check if headers have been added + // Iterate through extracted data to populate the table + for (Map row : extractedData) { + // Add headers once + if (!headersAdded) { + for (Map.Entry stateField : stateFieldMap.entrySet()) { + String headerValue = stateField.getValue(); // Header text -// Add table header -// Populate the table with extracted data and style rows - for (Map row : extractedData) { - for (Map.Entry entry : row.entrySet()) { - String key = entry.getKey(); // This will give you the key - String value = entry.getValue(); // This will give you the value + PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header + headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align + headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - // Check if the current entry is for the combined section - if ("combined".equals(key)) { - // Ensure the combined header is added only once - if (!combinedHeaderAdded) { - // Create a new table for combined entries - table = new PdfPTable(3); // 3 columns for combined entries - - PdfPCell headerCell1 = new PdfPCell(new Phrase("Number")); - headerCell1.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell1.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell1.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell1); - - PdfPCell headerCell2 = new PdfPCell(new Phrase("Details")); - headerCell2.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell2.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell2.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell2); - - PdfPCell headerCell3 = new PdfPCell(new Phrase("Amount")); - headerCell3.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell3.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell3.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell3); - - combinedHeaderAdded = true; // Mark header as added - } - - // Split the value for "combined" into separate parts - String[] combinedValues = value.split("; "); - - // Check if we have 3 parts (number, description, amount) - String number = combinedValues[0]; // 1st part (number) - String description = combinedValues[1]; // 2nd part (description) - String amount = ""; - if (combinedValues.length == 3) { - amount = combinedValues[2]; // 3rd part (amount) - } - - // Create PDF cells using the split values - PdfPCell cellNumber = new PdfPCell(new Phrase(number, textFont)); // Cell for number - PdfPCell cellDescription = new PdfPCell(new Phrase(description, textFont)); // Cell for description - PdfPCell cellAmount = new PdfPCell(new Phrase(amount, textFont)); // Cell for amount - - // Set row background color for combined values - cellNumber.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for combined rows - cellDescription.setBackgroundColor(new BaseColor(239, 243, 248)); - cellAmount.setBackgroundColor(new BaseColor(239, 243, 248)); - - // Set cell height and add rounded borders -// cellNumber.setFixedHeight(rowHeight); -// cellDescription.setFixedHeight(rowHeight); -// cellAmount.setFixedHeight(rowHeight); - - cellNumber.setMinimumHeight(20f); // Set minimum height for better appearance - cellDescription.setMinimumHeight(20f); // Set minimum height for better appearance - cellAmount.setMinimumHeight(20f); // Set minimum height for better appearance - - cellNumber.setPadding(7f); - cellDescription.setPadding(7f); - cellAmount.setPadding(7f); - - // Add the cells to the table only once - table.addCell(cellNumber); - table.addCell(cellDescription); - table.addCell(cellAmount); - - - } else { - if (!combinedHeaderAdded) { - // Create a new table for combined entries - table= new PdfPTable(2); // 3 columns for combined entries - table.setWidthPercentage(100); - - PdfPCell headerCell1 = new PdfPCell(new Phrase("Details")); - headerCell1.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell1.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell1.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell1); - - PdfPCell headerCell2 = new PdfPCell(new Phrase("Amount")); - headerCell2.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell2.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell2.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell2); - combinedHeaderAdded=true; -} - // Add cells for regular key-value pairs without headers - PdfPCell cellKey = new PdfPCell(new Phrase(key, textFont)); - PdfPCell cellValue = new PdfPCell(new Phrase(value, textFont)); - - // Set background color for both cells - cellKey.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for other rows - cellValue.setBackgroundColor(new BaseColor(239, 243, 248)); - - cellKey.setPadding(7f); - cellValue.setPadding(7f); - // Set cell height and add rounded borders - cellKey.setFixedHeight(rowHeight); - cellValue.setFixedHeight(rowHeight); - - // Add the cells to the table - table.addCell(cellKey); - table.addCell(cellValue); + table.addCell(headerCell); // Add the header cell to the table } - if (table.getTotalHeight() + rowHeight > maxTableHeight) { - // Start a new page if needed - document.add(table); - table = new PdfPTable(2); // Reset table for new page - table.setWidthPercentage(100); // Reset width percentage - combinedHeaderAdded = false; // Reset header flag + headersAdded = true; // Prevent headers from being added again + } + + // Add data rows matching stateFieldMap keys + for (Map.Entry stateField : stateFieldMap.entrySet()) { + String stateKey = stateField.getKey(); // Get the key from stateFieldMap + if (row.containsKey(stateKey)) { // If row contains the stateKey + Object value = row.get(stateKey); // Get the value from the row map + + PdfPCell dynamicCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); + dynamicCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dynamicCell.setMinimumHeight(rowHeight); + dynamicCell.setPadding(7f); + + table.addCell(dynamicCell); // Add the dynamically created cell to the table } } + + // Check if adding another row would exceed max height + if (table.getTotalHeight() + rowHeight > maxTableHeight) { + document.add(table); // Add the table to the document + document.newPage(); // Start a new page + table = new PdfPTable(stateFieldMap.size()); // Create a new table for the new page + table.setWidthPercentage(100); // Reset table width + + headersAdded = false; // Reset the header flag for the new page + } } - document.add(table); // Add the last table before returning + // Add the last table to the document + document.add(table); - // Check if adding a new row would exceed the maximum height -// Return the populated table return document; } + public static class RoundedBorderEvent implements PdfPTableEvent { @Override public void tableLayout(PdfPTable table, float[][] widths, float[] heights, @@ -489,82 +347,98 @@ public class PdfDao { canvas.stroke(); } } - public List getFormFieldsToLabels(FormApplicationResponse responseBean) { + public List getFormFieldsToLabels(FormApplicationResponse responseBean,PdfWriter writer,Document document) { List labelValuePairs = new ArrayList<>(); - // Iterate through each form in the application response - - List formFields = responseBean.getFormFields(); - List contents = responseBean.getContent(); - - // Iterate through each formField in the current form - for (ApplicationFormFieldResponseBean formField : formFields) { - String fieldId = formField.getFieldId(); - Object fieldValue = formField.getFieldValue(); - - // Find the content in the form that matches the fieldId - Optional matchingContent = contents.stream() - .filter(content -> content.getId().equals(fieldId)) - .findFirst(); + Font labelFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 12,new BaseColor(113,121,126)); // Light grey); + Font valueFont=FontFactory.getFont(FontFactory.HELVETICA_BOLD,10,new BaseColor(178, 190, 181)); - // If the content with the matching fieldId is found, create a label-value pair - if (matchingContent.isPresent()) { - String name = matchingContent.get().getName(); - if (name.equals("fileupload")) { + // Get form fields and contents from the response + List formFields = responseBean.getFormFields(); + List contents = responseBean.getContent(); -// Step 1: Check if fieldValue is an instance of List - if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { - // Step 2: Safely cast to List - List documentList = (List) fieldValue; + // Iterate through each content in the response + for (ContentResponseBean content : contents) { + String contentId = content.getId(); // Content ID + String label = content.getLabel(); // Content label + String name = content.getName(); // Content name + Object fieldValue = null; - // Step 3: Extract names from the document list - List names = documentList.stream() - .map(DocumentResponseBean::getName) // Extract the name from each DocumentResponseBean - .collect(Collectors.toList()); + String contentLabel = content.getSettings().stream() + .filter(setting -> "label".equals(setting.getName())) // Filter settings by name + .map(SettingResponseBean::getValue) // Extract the value from the matching setting + .map(Object::toString) // Convert the value to a string + .findFirst() // Get the first matching value + .orElse(null); // If no match is found, set label to null + // Find the form field in the response that matches the contentId + Optional matchingFormField = formFields.stream() + .filter(formField -> formField.getFieldId().equals(contentId)) + .findFirst(); - fieldValue=names; - } + // If a matching form field is found, process its value + if (matchingFormField.isPresent()) { + ApplicationFormFieldResponseBean formField = matchingFormField.get(); + fieldValue = formField.getFieldValue(); + + // If fieldValue is null, set it to an empty string + if (fieldValue == null) { + fieldValue = ""; + } + + // Process 'fileupload' and 'checkboxes' cases as in the original logic + if (name.equals("fileupload")) { + if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { + List documentList = (List) fieldValue; + List names = documentList.stream() + .map(DocumentResponseBean::getName) + .collect(Collectors.toList()); + fieldValue = names; } - if(name.equals("checkboxes")) { - List check = (List) fieldValue; - List settingResponseBeans = matchingContent.get().getSettings(); - for (SettingResponseBean settingResponseBean : settingResponseBeans) { - // Initialize a list to hold matched labels for each SettingResponseBean - List matchedLabels = new ArrayList<>(); - if (settingResponseBean.getValue() instanceof List) { + } else if (name.equals("checkboxes")) { + List check = (List) fieldValue; + List settingResponseBeans = content.getSettings(); + List matchedLabels = new ArrayList<>(); - List valueList = (List) settingResponseBean.getValue(); - if (!valueList.isEmpty() && valueList.get(0) instanceof Map) { - // Cast to List> - List> options = (List>) valueList; - for (Map field : options) { - for (String val : check) { - String name1=field.get("name"); - if (val.equals(name1)) { // Check if the key exists in the current field map - String label = field.get("label"); // Extract the label - if (field != null) { // Check if the value is not null - matchedLabels.add(label); // Add the value to the matchedValues list - } - } + for (SettingResponseBean settingResponseBean : settingResponseBeans) { + if (settingResponseBean.getValue() instanceof List) { + List> options = (List>) settingResponseBean.getValue(); + + for (Map field : options) { + for (String val : check) { + String name1 = field.get("name"); + if (val.equals(name1)) { + String labelVal = field.get("label"); + if (labelVal != null) { + matchedLabels.add(labelVal); } } - fieldValue = matchedLabels; } } } } - String label = matchingContent.get().getLabel(); - // Add the label-value pair to the list - if (fieldValue != null && !fieldValue.toString().trim().isEmpty()) { - fieldValue = findLabelInOptions(matchingContent.get().getSettings(), fieldValue); - labelValuePairs.add(new FieldLabelValuePairRequest(label, fieldValue)); - } + fieldValue = matchedLabels; } + + // Further processing of field value (e.g., finding labels in options) + fieldValue = findLabelInOptions(content.getSettings(), fieldValue); + } else { + // If no matching form field is found, store contentId with an empty string + fieldValue = ""; } + try { + addLabelValuePair(writer,document, contentLabel, fieldValue, labelFont,valueFont,content); + } catch (DocumentException e) { + log.error("Error checking object: " + e.getMessage(), e); + + } +// } labelValuePairs.add(new FieldLabelValuePairRequest(contentLabel, fieldValue)); + } + return labelValuePairs; } + public static Object findLabelInOptions(List settings, Object valueToFind) { ObjectMapper objectMapper = new ObjectMapper(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index ae75d8bd..33f235a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; @@ -84,17 +85,17 @@ public class UserDao { if(StringUtils.isEmpty(userReq.getHubUuid())) { userReq.setHubUuid(defaultHubUuid); } - validateUserRequest(request, tempToken, userReq); + HubEntity hub = hubService.getHubByUuid(userReq.getHubUuid()); + validateUserRequest(request, tempToken, userReq, hub); validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); - RoleEntity roleEntity = getRoleEntity(userReq.getRoleId()); - BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq); - UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq); + BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq, hub); + UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq, hub); log.info("User created with ID: {}", userEntity.getId()); return authService.getJWTTokenBean(userEntity, Boolean.TRUE); } - private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq) { + private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { BeneficiaryEntity beneficiaryEntity = null; if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) { beneficiaryEntity = new BeneficiaryEntity(); @@ -114,20 +115,22 @@ public class UserDao { beneficiaryEntity.setMarketing(userReq.getMarketing()); beneficiaryEntity.setThirdParty(userReq.getThirdParty()); beneficiaryEntity.setEmailPec(userReq.getEmailPec()); + beneficiaryEntity.setHubId(hub.getId()); beneficiaryEntity =beneficiaryRepository.save(beneficiaryEntity); } return beneficiaryEntity; } - private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq) { + private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq, HubEntity hub) { if (tempToken == null) { validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); + UserEntity userEntity = validator.validateUser(request); + userReq.setHubUuid(userEntity.getHub().getUniqueUuid()); }else { samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale(), userReq.getHubUuid()); } - RoleEntity role = roleService.validateRole(userReq.getRoleId()); if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); @@ -139,7 +142,7 @@ public class UserDao { Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) - && userRepository.existsByBeneficiaryCodiceFiscale(userReq.getCodiceFiscale())) { + && userRepository.existsByBeneficiaryCodiceFiscaleAndHubId(userReq.getCodiceFiscale(), hub.getId())) { log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); @@ -151,10 +154,14 @@ public class UserDao { if (tempToken != null) { userReq.setRoleId(null); } - if(tempToken == null && Boolean.TRUE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(role.getRoleType()))){ - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CANNOT_CREATE_BENEFICIARY_USER)); - } + + if (tempToken == null) { + RoleEntity role = roleService.validateRole(userReq.getRoleId()); + if (Boolean.TRUE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(role.getRoleType()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CANNOT_CREATE_BENEFICIARY_USER)); + } + } } private void validatePassword(String password, String confirmPassword, String tempToken) { @@ -206,7 +213,7 @@ public class UserDao { return convertUserEntityToUserResponse(userEntity); } - private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq) { + private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq, HubEntity hub) { UserEntity userEntity = new UserEntity(); if(Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getPassword()))) { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); @@ -215,7 +222,7 @@ public class UserDao { userEntity.setEmail(userReq.getEmail()); userEntity.setStatus(UserStatusEnum.ACTIVE.getValue()); userEntity.setBeneficiary(beneficiary); - userEntity.setHub(hubService.getHubByUuid(userReq.getHubUuid())); + userEntity.setHub(hub); if (Boolean.FALSE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()))) { userEntity.setFirstName(userReq.getFirstName()); userEntity.setLastName(userReq.getLastName()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index cc0f929e..5ddebe5c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -39,4 +39,7 @@ public class ApplicationEntity extends BaseEntity { @OneToOne @JoinColumn(name = "PROTOCOL_NUMBER") private ProtocolEntity protocol; + + @Column(name = "HUB_ID") + private Long hubId; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java index bae88c90..2e84dd51 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java @@ -61,4 +61,7 @@ public class BeneficiaryEntity extends BaseEntity { @Column(name = "EMAIL_PEC") private String emailPec; + + @Column(name = "HUB_ID") + private Long hubId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index c35a8cf0..ed50268f 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -4,6 +4,8 @@ import java.math.BigDecimal; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; @@ -56,4 +58,9 @@ public class CompanyEntity extends BaseEntity{ @Column(name = "CONTACT_EMAIL") private String contactEmail; + + @ManyToOne + @JoinColumn(name = "HUB_ID") + private HubEntity hub; + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index 08b436c8..fe44af47 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -6,7 +6,10 @@ public enum ApplicationStatusTypeEnum { DRAFT("DRAFT"), SUBMIT("SUBMIT"), - DISCARD("DISCARD"); + AWAITING("AWAITING"), + READY("READY"), + DISCARD("DISCARD"), + EVALUATION("EVALUATION"); private String value; 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 bdc0d015..6ca30e37 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.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; 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 8714d94c..b5ad3aae 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -14,6 +14,13 @@ public class AssignedApplicationsResponse extends BaseBean { private AssignedApplicationEnum status; private String note; private LocalDateTime assignedAt; + private Long protocolNumber; + private String callName; + private String beneficiaryName; + private LocalDateTime submissionDate; + private LocalDateTime callStartDate; + private LocalDateTime callEndDate; + } 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 51479254..6338949e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -20,6 +20,8 @@ public class CallDetailsResponseBean { private List dates; + private Boolean confidi; + private CallStatusEnum status; private Long regionId; 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 ed4a0206..b26460ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -5,8 +5,10 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.util.DynamicLocalTimeSerializer; @Data public class CallResponse { @@ -47,8 +49,10 @@ public class CallResponse { private String phoneNumber; + @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime startTime; + @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime endTime; private LocalDateTime createdDate; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index d3ff6d01..158c43fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -32,14 +32,14 @@ public interface ApplicationRepository extends JpaRepository findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId); + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId") + public Long countSubmittedApplicationsByHubId(@Param("hubId") Long hubId); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'DRAFT' And a.hubId = :hubId") + public Long countDraftApplicationsByHubId(@Param("hubId") Long hubId); + @Query("SELECT a.call.id FROM ApplicationEntity a WHERE a.id = :id") Long findCallIdById(@Param("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 4e651fe0..12934e36 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,8 +1,8 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; -import net.gepafin.tendermanagement.enums.CallStatusEnum; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; @@ -11,18 +11,30 @@ import java.util.List; @Repository public interface CallRepository extends JpaRepository { - public CallEntity findByIdAndStatusNotIn(Long id, List status); - List findByStatusIn(List callStatus); +// public CallEntity findByIdAndStatusNotIn(Long id, List status); + +// List findByStatusIn(List callStatus); - public CallEntity findByIdAndStatus(Long id,String status); +// public CallEntity findByIdAndStatus(Long id,String status); - public Long countByStatus(String status); +// public Long countByStatus(String status); - @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH'") - BigDecimal findTotalAmountOfPublishedCalls(); +// @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH'") +// BigDecimal findTotalAmountOfPublishedCalls(); - @Query("SELECT c.name, COUNT(a.id) " + - "FROM CallEntity c LEFT JOIN ApplicationEntity a ON c.id = a.call.id " + - "GROUP BY c.name") - List findApplicationsPerCall(); +// @Query("SELECT c.name, COUNT(a.id) " + +// "FROM CallEntity c LEFT JOIN ApplicationEntity a ON c.id = a.call.id " + +// "GROUP BY c.name") +// List findApplicationsPerCall(); + + public List findByStatusInAndHubId(List callStatus, Long hubId); + + public CallEntity findByIdAndStatusAndHubId(Long id, String status, Long hubId); + + public Long countByStatusAndHubId(String status, Long hubId); + + public CallEntity findByIdAndStatusNotInAndHubId(Long id, List status, Long hubId); + + @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH' And c.hub.id = :hubId") + BigDecimal findTotalAmountOfPublishedCallsAndHubId(@Param("hubId") Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java index c0c5f75d..b9395883 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java @@ -4,6 +4,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import net.gepafin.tendermanagement.entities.CompanyEntity; @@ -11,13 +12,14 @@ import net.gepafin.tendermanagement.entities.CompanyEntity; @Repository public interface CompanyRepository extends JpaRepository { - List findByIdIn(List companyIds); + List findByIdInAndHubId(List companyIds, Long hubId); - Boolean existsByVatNumber(String vatNumber); - CompanyEntity findByVatNumber(String vatNumber); + Boolean existsByVatNumberAndHubId(String vatNumber, Long hubId); - @Query("SELECT COUNT(c) FROM CompanyEntity c") - long countTotalCompanies(); + @Query("SELECT COUNT(c) FROM CompanyEntity c where c.hub.id = :hubId") + long countTotalCompaniesByHubId(@Param("hubId") Long hubId); + + CompanyEntity findByVatNumberAndHubId(String vatNumber, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java index 257b8ed8..3135e7cd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java @@ -1,9 +1,19 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface LoginAttemptRepository extends JpaRepository { + + @Query("SELECT la FROM LoginAttemptEntity la LEFT JOIN UserEntity u ON u.email = la.username WHERE u.hub.id = :hubId") + Page findByHubId(@Param("hubId") Long hubId, PageRequest pageRequest); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index e474fccf..47ab16b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -10,21 +10,9 @@ import java.util.Optional; @Repository public interface UserRepository extends JpaRepository { -// Optional findByEmailIgnoreCase(String email); - -// boolean existsByEmailIgnoreCase(String email); - -// UserEntity findByEmail(String email); - - Optional findByBeneficiaryCodiceFiscale(String codiceFiscale); - - boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale); - UserEntity findByBeneficiaryId(Long beneficiaryId); - Long countByStatusAndRoleEntityRoleType(String status, String roleName); - - Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubId); + Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); boolean existsByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); @@ -33,4 +21,8 @@ public interface UserRepository extends JpaRepository { List findByHubId(Long hubId); Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); + + Optional findByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); + + boolean existsByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java index d17b93e2..ec93f2f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java @@ -14,10 +14,8 @@ public interface UserWithCompanyRepository extends JpaRepository findActiveCompanyIdsByUserId(@Param("userId") Long userId); - - + @Query("SELECT u.companyId FROM UserWithCompanyEntity u WHERE u.userId = :userId AND u.isDeleted = false") + List findActiveCompanyIdsByUserId(@Param("userId") Long userId); Optional findByUserIdAndCompanyIdAndIsDeletedFalse(Long userId, 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 62d62b88..c9a65fef 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -40,4 +40,6 @@ public interface ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId); + public ApplicationResponse validateApplication(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 index 2e211916..166e9180 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -13,7 +13,7 @@ public interface AssignedApplicationsService { void deleteApplication(HttpServletRequest request, Long id); - List getAllAssignedApplications(Long userId); + List getAllAssignedApplications(HttpServletRequest request, Long userId); AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest assignedApplicationsRequest); - AssignedApplicationsResponse getAssignedApplicationById(Long id); + AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 8abe4cb5..92a62f02 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -29,6 +29,6 @@ public interface CallService { CallEntity validateCall(Long callId); - CallEntity validatePublishedCall(Long callId); - byte[] downloadCallDocumentsAsZip(Long callId); + CallEntity validatePublishedCall(Long callId, Long hubId); + byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java b/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java index 3e4ed31a..6c8990e1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java @@ -9,7 +9,7 @@ import java.util.List; public interface LoginAttemptService { - LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit); + LoginAttemptPageableResponseBean> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit); void createLoginAttempt(LoginAttemptReq loginAttemptReq, HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 9a1bdf9a..21109a5e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -17,11 +17,11 @@ import java.util.List; public interface UserService { JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq); - UserResponseBean updateUser(Long userId, UpdateUserReq userReq); + UserResponseBean updateUser(HttpServletRequest request, Long userId, UpdateUserReq userReq); - UserResponseBean getUserById(Long userId); + UserResponseBean getUserById(HttpServletRequest request, Long userId); - void deleteUser(Long userId); + void deleteUser(HttpServletRequest request, Long userId); JWTToken login(LoginReq loginReq,HttpServletRequest request); 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 b9308d46..779a3d09 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -65,6 +65,7 @@ public class ApplicationServiceImpl implements ApplicationService { public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { UserEntity userEntity = validator.validateUser(request); CompanyEntity companyEntity = validator.validateUserWithCompany(request, companyId); + validator.validateUserWithCall(userEntity, callId); return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); } @@ -110,6 +111,11 @@ public class ApplicationServiceImpl implements ApplicationService { applicationDao.deleteSignedDocument(request, applicationId); } + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { + 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 index 00733f07..e0301dec 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -26,32 +26,32 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ @Transactional(rollbackFor = Exception.class) public AssignedApplicationsResponse createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { UserEntity assignedByUser= validator.validateUser(request); + validator.validatePreInstructor(request, userId); return assignedApplicationsDao.createAssignedApplications(applicationId,userId,assignedByUser, assignedApplicationsRequest); } @Override @Transactional(rollbackFor = Exception.class) public void deleteApplication(HttpServletRequest request, Long id) { - assignedApplicationsDao.deleteById(id); + assignedApplicationsDao.deleteById(request, id); } @Override @Transactional(readOnly = true) - public List getAllAssignedApplications(Long userId) { - return assignedApplicationsDao.getAllAssignedApplications(userId); + public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + return assignedApplicationsDao.getAllAssignedApplications(request, 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); + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updatedAssignedApplicationRequest) { + return assignedApplicationsDao.updateAssignedApplication(request, id, updatedAssignedApplicationRequest); } @Override @Transactional(readOnly = true) - public AssignedApplicationsResponse getAssignedApplicationById(Long id) { - return assignedApplicationsDao.getAssignedApplicationById(id); + public AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id) { + return assignedApplicationsDao.getAssignedApplicationById(request, id); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 95eb6763..5a2d9ded 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.CompanyDao; import net.gepafin.tendermanagement.dao.LoginAttemptDao; import net.gepafin.tendermanagement.dao.RoleDao; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -22,6 +23,7 @@ import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -63,6 +65,9 @@ public class AuthenticationService { @Autowired private LoginAttemptDao loginAttemptDao; + + @Autowired + private HubService hubService; @Autowired public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { @@ -72,7 +77,7 @@ public class AuthenticationService { public JWTToken login(LoginReq loginReq, HttpServletRequest request) { UserEntity user=null; - + LoginAttemptEntity loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); log.info("Attempting login for email: {}", loginReq.getEmail()); String emailWithHubId = loginReq.getEmail()+":"+loginReq.getHubUuid(); @@ -186,10 +191,11 @@ public class AuthenticationService { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf) + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); //samlResponseLogRepository.delete(samlResponseLogEntity); @@ -205,10 +211,11 @@ public class AuthenticationService { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - if (userRepository.existsByBeneficiaryCodiceFiscale(cf)) { + if (userRepository.existsByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId())) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_ALREADY_EXIST_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java index 4484027e..01f2648a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java @@ -9,7 +9,6 @@ import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; -import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.BeneficiaryPreferredCallService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Validator; @@ -17,7 +16,6 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; import java.util.List; @@ -26,10 +24,10 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Autowired private BeneficiaryPreferredCallDao beneficiaryPreferredCallDao; + @Autowired private Validator validator; - @Autowired - private UserRepository userRepository; + @Autowired private UserService userService; @@ -37,22 +35,22 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Override public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest request, BeneficiaryPreferredCallReq beneficiaryPreferredCallRequest) { UserEntity userEntity = validator.validateUser(request); - return beneficiaryPreferredCallDao.createBeneficiaryPreferredCall(beneficiaryPreferredCallRequest,userEntity); + return beneficiaryPreferredCallDao.createBeneficiaryPreferredCall(request, beneficiaryPreferredCallRequest,userEntity); } @Override public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { - return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallById(id); + return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallById(request, id); } @Override public void deleteBeneficiaryPreferredCall(HttpServletRequest request, Long id) { - beneficiaryPreferredCallDao.deleteBeneficiaryPreferredCallById(id); + beneficiaryPreferredCallDao.deleteBeneficiaryPreferredCallById(request, id); } @Override public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) { - return beneficiaryPreferredCallDao.getAllBeneficiaryPreferredCalls(); + return beneficiaryPreferredCallDao.getAllBeneficiaryPreferredCalls(request); } // @Override @@ -68,6 +66,7 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Override public List getBeneficiaryPreferredCallByUserId(HttpServletRequest request,Long userId,Long beneficiaryId,Long companyId) { UserEntity userEntity =validateGetBeneficiaryPreferredCallrequest(request,userId,beneficiaryId); + validator.validateUserId(request, userEntity.getId()); return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallByUserId(userEntity,companyId); } @@ -81,7 +80,7 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred } if(beneficiaryId!=null){ UserEntity user = userService.getUserByBeneficiaryId(beneficiaryId); - return validator.validateUserId(request,user.getId()); + return validator.validateUserId(request, user.getId()); } else{ return validator.validateUserId(request, userId); 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 281b33b1..8004008b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -91,13 +91,15 @@ public class CallServiceImpl implements CallService { } @Override - public CallEntity validatePublishedCall(Long callId) { - return callDao.validatePublishedCall(callId); + public CallEntity validatePublishedCall(Long callId, Long hubId) { + return callDao.validatePublishedCall(callId, hubId); } @Override @Transactional(readOnly = true) - public byte[] downloadCallDocumentsAsZip(Long callId) { + public byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { + UserEntity user = validator.validateUser(request); + validator.validateUserWithCall(user, callId); return callDao.downloadCallDocumentsAsZip(callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 34c8777f..5ab99b13 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -49,6 +49,7 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(rollbackFor = Exception.class) public CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); return companyDao.updateCompany(userEntity, companyId, companyRequest); } @@ -56,6 +57,7 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(readOnly = true) public CompanyResponse getCompany(HttpServletRequest request, Long companyId) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); return companyDao.getCompany(userEntity, companyId); } @@ -63,13 +65,14 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(rollbackFor = Exception.class) public void deleteCompany(HttpServletRequest request, Long companyId) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); companyDao.deleteCompany(userEntity, companyId); } @Override @Transactional(readOnly = true) public List getCompanyByUserId(HttpServletRequest request, Long userId) { - validator.validateUser(request); + validator.validateUserId(request, userId); return companyDao.getCompanyByUserId(userId); } @@ -91,8 +94,7 @@ public class CompanyServiceImpl implements CompanyService { @Override @Transactional(readOnly = true) public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { - UserEntity userEntity =validator.validateUser(request); - return delegationDao.downloadCompanyDelegation(userEntity, companyId, companyDelegationRequest); + return delegationDao.downloadCompanyDelegation(request, companyId, companyDelegationRequest); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java index 2ae5546f..5bd9d4d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java @@ -5,6 +5,8 @@ import net.gepafin.tendermanagement.dao.FlowDao; import net.gepafin.tendermanagement.model.request.FlowRequestBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.service.FlowService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,16 +16,21 @@ public class FlowServiceImpl implements FlowService { @Autowired private FlowDao flowDao; + + @Autowired + private Validator validator; @Override @Transactional(rollbackFor = Exception.class) public FlowResponseBean createOrUpdateFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + validator.validateUserWithCall(validator.validateUser(httpServletRequest), callId); return flowDao.createOrUpdateFlow(flowRequestBean,callId); } @Override @org.springframework.transaction.annotation.Transactional(readOnly = true) public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId) { + validator.validateUserWithCall(validator.validateUser(request), callId); return flowDao.getFlowByCallId(callId); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java index 1519273f..fb645aac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java @@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.LoginAttemptDao; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.LoginAttemptResultEnum; import net.gepafin.tendermanagement.enums.LoginAttemptTypeEnum; import net.gepafin.tendermanagement.model.request.LoginAttemptReq; import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean; import net.gepafin.tendermanagement.service.LoginAttemptService; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,22 +22,30 @@ public class LoginAttemptServiceImpl implements LoginAttemptService { @Autowired LoginAttemptDao loginAttemptDao; + + @Autowired + private Validator validator; @Override - public LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { - return loginAttemptDao.getLoginAttemptsList(pageNo, pageLimit); + public LoginAttemptPageableResponseBean> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit) { + return loginAttemptDao.getLoginAttemptsList(validator.validateUser(request), pageNo, pageLimit); } @Override public void createLoginAttempt(LoginAttemptReq loginAttemptReq, HttpServletRequest request) { String ipAddress = Utils.getClientIpAddress(request); String userAgent = request.getHeader("user-agent"); + LoginAttemptEntity loginAttemptEntity = new LoginAttemptEntity(); loginAttemptEntity.setType(LoginAttemptTypeEnum.SWITCH.getValue()); loginAttemptEntity.setIpAddress(ipAddress); loginAttemptEntity.setUserAgent(userAgent); loginAttemptEntity.setUsername(loginAttemptReq.getUserName()); loginAttemptEntity.setResult(LoginAttemptResultEnum.SUCCESS.getValue()); + if(loginAttemptReq.getUserId() != null) { + UserEntity userEntity = validator.validateUserId(request, loginAttemptReq.getUserId()); + loginAttemptEntity.setUserId(userEntity.getId()); + } loginAttemptDao.createLoginAttempt(loginAttemptEntity); } } 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 3f325320..5d3640f9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -40,19 +40,22 @@ public class UserServiceImpl implements UserService { @Override @Transactional(rollbackFor = Exception.class) - public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { + public UserResponseBean updateUser(HttpServletRequest request, Long userId, UpdateUserReq userReq) { + validator.validateUserId(request, userId); return userDao.updateUser(userId, userReq); } @Override @Transactional(readOnly = true) - public UserResponseBean getUserById(Long userId) { + public UserResponseBean getUserById(HttpServletRequest request, Long userId) { + validator.validateUserId(request, userId); return userDao.getUserById(userId); } @Override @Transactional(rollbackFor = Exception.class) - public void deleteUser(Long userId) { + public void deleteUser(HttpServletRequest request, Long userId) { + validator.validateUserId(request, userId); userDao.deleteUser(userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java b/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java new file mode 100644 index 00000000..0fcdaa77 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.util; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class DynamicLocalTimeSerializer extends JsonSerializer { + private static final DateTimeFormatter HH_MM_FORMAT = DateTimeFormatter.ofPattern("HH:mm"); + private static final DateTimeFormatter HH_MM_SS_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss"); + + @Override + public void serialize(LocalTime time, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // Use HH:mm if seconds are 00, otherwise use HH:mm:ss + String formattedTime = (time.getSecond() == 0) + ? time.format(HH_MM_FORMAT) + : time.format(HH_MM_SS_FORMAT); + + gen.writeString(formattedTime); + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index bc8aff6c..a845aaad 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -31,6 +31,8 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundExcep import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; +import static org.apache.commons.lang3.StringUtils.isEmpty; + public class Utils { @@ -315,4 +317,57 @@ public class Utils { } return content.trim().replace(" ", "_"); } + public static List> convertJsonStringIntoJsonList(String jsonString) { + try { + if(isEmpty(jsonString)) + { + return new ArrayList<>(); + } + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); + return mapper.readValue(jsonString, List.class); + } catch (Exception e) { + log.error(e.getMessage()); + } + return null; + } + public static String convertToString(Object input) { + if (input == null) { + return "null"; // Return string "null" for null input + } + + if (input instanceof String) { + return (String) input; // Return the string directly if input is a string + } + + if (input instanceof Collection) { + // Handle collections (List, Set, etc.) + return convertCollectionToString((Collection) input); + } + + if (input instanceof Map) { + // Handle maps + return convertMapToString((Map) input); + } + + // For other types (like Integer, Boolean, etc.), use toString() + return input.toString(); + } + + private static String convertCollectionToString(Collection collection) { + try { + return mapper.writeValueAsString(collection); // Convert the collection to a JSON string + } catch (JsonProcessingException e) { + throw new RuntimeException("Error converting collection to string", e); + } + } + + private static String convertMapToString(Map map) { + try { + return mapper.writeValueAsString(map); // Convert the map to a JSON string + } catch (JsonProcessingException e) { + throw new RuntimeException("Error converting map to string", e); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 09563378..f4f2e2bd 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -4,7 +4,6 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -65,6 +64,20 @@ public class Validator { } return false; } + + public Boolean checkIsPreInstructor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.isAuthenticated()) { + // Check if the user has the ROLE_SUPER_ADMIN authority + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_PRE_INSTRUCTOR.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } public void validateRequest(HttpServletRequest request,RoleStatusEnum role) { if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin())) { @@ -73,13 +86,24 @@ public class Validator { } public CompanyEntity validateUserWithCompany(HttpServletRequest request, Long companyId) { + CompanyEntity companyEntity = companyService.validateCompany(companyId); + validateHubId(request, companyEntity.getHub().getId()); if (checkIsSuperAdmin()) { - return companyService.validateCompany(companyId); + return companyEntity; } Map userInfo = tokenProvider.getUserInfoAndUserIdFromToken(request); companyService.validateUserWithCompny(getUserId(userInfo), companyId); return companyService.validateCompany(companyId); } + + public void validateHubId(HttpServletRequest request, Long hubId) { + UserEntity user = validateUser(request); + Long hubIdFromHttpRequest = user.getHub().getId(); + if (Boolean.FALSE.equals(hubIdFromHttpRequest.equals(hubId))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + } private Long getUserId(Map userInfo) { return Long.parseLong(userInfo.get("userId").toString()); @@ -100,10 +124,15 @@ public class Validator { public UserEntity validateUserId(HttpServletRequest request, Long userId) { UserEntity user = validateUser(request); - if(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()) && Boolean.FALSE.equals(user.getId().equals(userId))) { - throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + UserEntity requestedUser = userService.validateUser(userId); + + validateHubId(request, requestedUser.getHub().getId()); + if (Boolean.FALSE.equals(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_SUPER_ADMIN.getValue())) + && Boolean.FALSE.equals(user.getId().equals(userId))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } - return userService.validateUser(userId); + return requestedUser; } private Long getUserIdFromToken(HttpServletRequest request) { @@ -123,5 +152,20 @@ public class Validator { String[] activeProfiles = environment.getActiveProfiles(); return Arrays.stream(activeProfiles).anyMatch("production"::equals); } + + public UserEntity validatePreInstructor(HttpServletRequest request, Long preInstructorUserId) { + UserEntity preInstructorUser = userService.validateUser(preInstructorUserId); + if (checkIsSuperAdmin()) { + if (preInstructorUserId != null) { + validateHubId(request, preInstructorUser.getHub().getId()); + } + return preInstructorUser; + } else if (checkIsPreInstructor()) { + return validateUserId(request, preInstructorUserId); + } else { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + } } 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 38da1d7e..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 @@ -176,17 +176,30 @@ public interface ApplicationApi { ResponseEntity> getSignedDocument(HttpServletRequest request, @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); - @Operation(summary = "Api to delete signed 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) })) }) - @DeleteMapping(value = "{applicationId}/signedDocument", produces = "application/json") - ResponseEntity> deleteSignedDocument(HttpServletRequest request, - @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); - - +// @Operation(summary = "Api to delete signed 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) })) }) +// @DeleteMapping(value = "{applicationId}/signedDocument", produces = "application/json") +// ResponseEntity> deleteSignedDocument(HttpServletRequest request, +// @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); + + @Operation(summary = "Api to validate 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) })) }) + @PostMapping(value = "/{applicationId}/validate", produces = { "application/json" }) + ResponseEntity> validateApplication(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + + } 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 dfbbfc37..1cfbb5c9 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,7 @@ 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; @@ -66,7 +64,8 @@ public interface AssignedApplicationsApi { @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); + ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); @Operation(summary = "Api to update assigned application", responses = { @@ -94,7 +93,9 @@ public interface AssignedApplicationsApi { @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); + ResponseEntity> getAssignedApplicationById(HttpServletRequest request, + @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/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 3fcfad5d..c4539e31 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -74,7 +74,7 @@ public interface CallApi { public ResponseEntity> updateCallStep1(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); - @Operation(summary = "Api to get call by id", + @Operation(summary = "Api to get call by id updated today to check the bug", 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/LoginAttemptApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java index 379a1d05..4a71d545 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java @@ -41,7 +41,7 @@ public interface LoginAttemptApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/login-attempt", produces = {"application/json"}) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - default ResponseEntity>> getLoginAttemptsList( + default ResponseEntity>> getLoginAttemptsList(HttpServletRequest request, @ApiParam(value = "page number") @RequestParam(name = "pageNo", required = false) Integer pageNo, @ApiParam(value = "page limit") @RequestParam(name = "pageLimit", required = false) Integer pageLimit) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); 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 8982e45e..c7b8e530 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 @@ -59,7 +59,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}", produces = {"application/json"}, method = RequestMethod.PUT) - default ResponseEntity> updateUser( + default ResponseEntity> updateUser(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @Parameter(description = "User request object", required = true) @Valid @RequestBody UpdateUserReq userReq) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); @@ -77,7 +77,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}", produces = {"application/json"}, method = RequestMethod.GET) - default ResponseEntity> getUserById( + default ResponseEntity> getUserById(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -93,7 +93,7 @@ public interface UserApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "/{userId}", method = RequestMethod.DELETE) - default ResponseEntity> deleteUser( + default ResponseEntity> deleteUser(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } 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 833e8651..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 @@ -133,13 +133,20 @@ public class ApplicationApiController implements ApplicationApi { .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_SIGNED_DOCUMENT_FILE_SUCCESS))); } +// @Override +// public ResponseEntity> deleteSignedDocument(HttpServletRequest request, +// Long applicationId) { +// applicationService.deleteSignedDocument(request, applicationId); +// log.info("delete signed document applicationId: {}", applicationId); +// return ResponseEntity.status(HttpStatus.OK) +// .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_SIGNED_DOCUMENT_FILE_SUCCESS))); +// } + @Override - public ResponseEntity> deleteSignedDocument(HttpServletRequest request, - Long applicationId) { - applicationService.deleteSignedDocument(request, applicationId); - log.info("delete signed document applicationId: {}", applicationId); + public ResponseEntity> validateApplication(HttpServletRequest request, Long applicationId) { + ApplicationResponse applicationResponse = applicationService.validateApplication(request, applicationId); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_SIGNED_DOCUMENT_FILE_SUCCESS))); + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); } - + } 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 9c4f0ad4..90f989de 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 @@ -43,9 +43,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { } @Override - public ResponseEntity>> getAllAssignedApplications(Long userId) { + public ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, Long userId) { log.info("Get All Assigned Applications"); - List applications = assignedApplicationsService.getAllAssignedApplications(userId); + List applications = assignedApplicationsService.getAllAssignedApplications(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } @@ -59,9 +59,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { } @Override - public ResponseEntity> getAssignedApplicationById(Long id) { + public ResponseEntity> getAssignedApplicationById(HttpServletRequest request, Long id) { log.info("Get Assigned Applications By Id"); - AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(id); + AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(request, 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/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index b06380e4..69154098 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -88,7 +88,7 @@ public class CallApiController implements CallApi { } @Override public ResponseEntity downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { - byte[] zipFile = callService.downloadCallDocumentsAsZip(callId); + byte[] zipFile = callService.downloadCallDocumentsAsZip(request, callId); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java index ed3a048b..cfd601b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java @@ -39,8 +39,8 @@ public class LoginAttemptApiController implements LoginAttemptApi { private UserService userService; @Override - public ResponseEntity>> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { - LoginAttemptPageableResponseBean> response = loginAttemptService.getLoginAttemptsList(pageNo, pageLimit); + public ResponseEntity>> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit) { + LoginAttemptPageableResponseBean> response = loginAttemptService.getLoginAttemptsList(request, pageNo, pageLimit); return ResponseEntity.status(HttpStatus.OK).body(response); } 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 413feaac..1a3040c1 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 @@ -44,29 +44,29 @@ public class UserApiController implements UserApi { } @Override - public ResponseEntity> updateUser( + public ResponseEntity> updateUser(HttpServletRequest request, @PathVariable("userId") Long userId, @Valid @RequestBody UpdateUserReq userReq) { log.info("Update User - User ID: {}, Request Body: {}", userId, userReq); - UserResponseBean updatedUser = userService.updateUser(userId, userReq); + UserResponseBean updatedUser = userService.updateUser(request, userId, userReq); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); } @Override - public ResponseEntity> getUserById( + public ResponseEntity> getUserById(HttpServletRequest request, @PathVariable("userId") Long userId) { log.info("Get User by ID - User ID: {}", userId); - UserResponseBean user = userService.getUserById(userId); + UserResponseBean user = userService.getUserById(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); } @Override - public ResponseEntity> deleteUser( + public ResponseEntity> deleteUser(HttpServletRequest request, @PathVariable("userId") Long userId) { log.info("Delete User - User ID: {}", userId); - userService.deleteUser(userId); + userService.deleteUser(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_DELETED_SUCCESS_MSG))); } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index f7ccb81a..8fa5c7a6 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -8,7 +8,10 @@ spring.datasource.driver-class-name=org.postgresql.Driver spring.h2.console.enabled=true isVatCheckGloballyDisabled = false + isMailSendingEnabled = true default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=rinaldo.bonazzo@bflows.net -rinaldo_email=rinaldo.bonazzo@bflows.net \ No newline at end of file +rinaldo_email=rinaldo.bonazzo@bflows.net +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 6b925e03..76aca344 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -6,4 +6,11 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.jpa.show-sql=true -base-url=http://localhost:8080 \ No newline at end of file +base-url=http://localhost:8080 + +isMailSendingEnabled = false +default_System_Receiver_Email=test@test.test +gepafin_email=test@test.test +rinaldo_email=test@test.test +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 725d9c8a..be007786 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -14,8 +14,10 @@ fe.base.url=https://bandi.gepafin.it #SPID configuration spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production + isMailSendingEnabled = true default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 12b95acb..1dbc41cc 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -5,4 +5,10 @@ spring.datasource.password=sa # JPA Configuration spring.h2.console.enabled=true -base-url=http://localhost:8080 \ No newline at end of file +base-url=http://localhost:8080 +isMailSendingEnabled = false +default_System_Receiver_Email=test@test.test +gepafin_email=test@test.test +rinaldo_email=test@test.test +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 75ab20cf..2ad3ba65 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ spring.application.name=tendermanagement # Multipart Configuration -spring.servlet.multipart.max-file-size=15MB -spring.servlet.multipart.max-request-size=15MB +spring.servlet.multipart.max-file-size=300MB +spring.servlet.multipart.max-request-size=300MB spring.profiles.active=testing @@ -59,10 +59,4 @@ mailGun_base_url=https://api.eu.mailgun.net/ # SendinBlue API key apiKey=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 #senderEmail=mailer@bflows.net -isMailSendingEnabled = false -default_System_Receiver_Email=antonio.manca@bflows.net -gepafin_email=rinaldo.bonazzo@bflows.net -rinaldo_email=rinaldo.bonazzo@bflows.net -carlo_email=rinaldo.bonazzo@bflows.net -default.hub.uuid=p4lk3bcx1RStqTaIVVbXs 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 06d8550a..72224de3 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 @@ -1336,13 +1336,78 @@ - + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1418,4 +1483,6 @@ + + diff --git a/src/main/resources/db/changelog/dynamic-triggers.xml b/src/main/resources/db/changelog/dynamic-triggers.xml index 23f1101e..9356279d 100644 --- a/src/main/resources/db/changelog/dynamic-triggers.xml +++ b/src/main/resources/db/changelog/dynamic-triggers.xml @@ -20,7 +20,7 @@ ) LOOP EXECUTE format( - 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_updated_at_%I + 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_updated_date_%I BEFORE UPDATE ON gepafin_schema.%I FOR EACH ROW EXECUTE FUNCTION gepafin_schema.clock_timestamp_updated_date_column()', @@ -37,7 +37,7 @@ ) LOOP EXECUTE format( - 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_created_at_%I + 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_created_date_%I BEFORE INSERT ON gepafin_schema.%I FOR EACH ROW EXECUTE FUNCTION gepafin_schema.clock_timestamp_created_date_column()', diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7061921f..b92a48f9 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -264,6 +264,8 @@ hub_get_all_success=Hubs retrieved successfully hub_delete_success=Hub deleted successfully hub_not_found=Hub not found +application.not.in.draft.status=Application is not in DRAFT status. + application.assigned.success.msg = Application assigned successfully. @@ -273,4 +275,4 @@ 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. get.error.s3=Failed to fetch the file from S3. - +invalid.application.status = Invalid Application status. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 22096e98..214a198e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -259,6 +259,7 @@ aasigned.application.not.found = Applicazione assegnata non trovata con l'ID spe 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. +invalid.application.status = Stato della domanda non valido. # Hub Messages hub_create_success=Hub creato con successo @@ -267,4 +268,6 @@ hub_get_success=Hub recuperato con successo 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. get.error.s3=Impossibile recuperare il file da S3.