Merge pull request #121 from Kitzanos/develop

Sync master with develop branch(05/12/2024)
This commit is contained in:
rbonazzo-KZ
2024-12-05 08:30:48 +01:00
committed by GitHub
115 changed files with 4368 additions and 974 deletions

View File

@@ -226,6 +226,11 @@
</dependency> </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>
<repository> <repository>

View File

@@ -0,0 +1,26 @@
package net.gepafin.tendermanagement.config;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class CachedBodyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest httpServletRequest) {
CachedBodyHttpServletRequest cachedRequest = new CachedBodyHttpServletRequest(httpServletRequest);
chain.doFilter(cachedRequest, response);
} else {
chain.doFilter(request, response);
}
}
}

View File

@@ -0,0 +1,76 @@
package net.gepafin.tendermanagement.config;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
private final byte[] cachedBody;
public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
InputStream requestInputStream = request.getInputStream();
this.cachedBody = requestInputStream.readAllBytes();
}
@Override
public ServletInputStream getInputStream() {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cachedBody);
return new ServletInputStreamWrapper(byteArrayInputStream);
}
@Override
public BufferedReader getReader() throws IOException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cachedBody);
return new BufferedReader(new InputStreamReader(byteArrayInputStream));
}
public String getCachedBodyAsString() {
return new String(cachedBody);
}
private static class ServletInputStreamWrapper extends ServletInputStream {
private final ByteArrayInputStream byteArrayInputStream;
public ServletInputStreamWrapper(ByteArrayInputStream byteArrayInputStream) {
this.byteArrayInputStream = byteArrayInputStream;
}
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
@Override
public boolean isFinished() {
return byteArrayInputStream.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
}
}

View File

@@ -0,0 +1,25 @@
package net.gepafin.tendermanagement.config;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class RequestCachingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest cachedRequest = new CachedBodyHttpServletRequest((HttpServletRequest) request);
chain.doFilter(cachedRequest, response);
} else {
chain.doFilter(request, response);
}
}
}

View File

@@ -0,0 +1,29 @@
package net.gepafin.tendermanagement.config;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class UniqueSessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
request.getSession(true);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
if ("/v1/user/logout".equals(request.getRequestURI())) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
}
}
}

View File

@@ -1,18 +1,18 @@
package net.gepafin.tendermanagement.config.jwt; package net.gepafin.tendermanagement.config.jwt;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.GenericFilterBean;
import java.io.IOException; import java.io.IOException;
public class JWTFilter extends GenericFilterBean { import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class JWTFilter extends OncePerRequestFilter {
private final TokenProvider tokenProvider; private final TokenProvider tokenProvider;
@@ -20,9 +20,10 @@ public class JWTFilter extends GenericFilterBean {
this.tokenProvider = tokenProvider; this.tokenProvider = tokenProvider;
} }
@Override protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) FilterChain filterChain) throws ServletException, IOException {
throws IOException, ServletException {
try {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = resolveToken(httpServletRequest); String token = resolveToken(httpServletRequest);
@@ -34,6 +35,10 @@ public class JWTFilter extends GenericFilterBean {
} }
filterChain.doFilter(servletRequest, servletResponse); filterChain.doFilter(servletRequest, servletResponse);
} catch (Exception e) {
servletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
}
} }
private String resolveToken(HttpServletRequest request) { private String resolveToken(HttpServletRequest request) {

View File

@@ -1,18 +1,21 @@
package net.gepafin.tendermanagement.config.jwt; package net.gepafin.tendermanagement.config.jwt;
import io.jsonwebtoken.Claims; import static io.micrometer.common.util.StringUtils.isEmpty;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import java.nio.charset.StandardCharsets;
import io.jsonwebtoken.security.Keys; import java.util.Arrays;
import jakarta.annotation.PostConstruct; import java.util.Base64;
import jakarta.servlet.http.HttpServletRequest; import java.util.Collection;
import net.gepafin.tendermanagement.config.Translator; import java.util.Collections;
import net.gepafin.tendermanagement.constants.GepafinConstant; import java.util.Date;
import net.gepafin.tendermanagement.entities.UserEntity; import java.util.HashMap;
import net.gepafin.tendermanagement.repositories.UserRepository; import java.util.HashSet;
import net.gepafin.tendermanagement.util.Utils; import java.util.Map;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import java.util.Set;
import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; import java.util.stream.Collectors;
import javax.crypto.SecretKey;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -23,18 +26,28 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import com.google.gson.Gson; import com.google.gson.Gson;
import static io.micrometer.common.util.StringUtils.isEmpty; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException;
@Component @Component
@@ -45,17 +58,18 @@ public class TokenProvider {
private String secretKey; private String secretKey;
@Value("${security.authentication.jwt.token-validity-in-seconds}") @Value("${security.authentication.jwt.token-validity-in-seconds}")
private long tokenValidityInSeconds; private int tokenValidityInSeconds;
@Autowired @Autowired
private UserRepository userRepository; private UserRepository userRepository;
@Autowired
HttpServletResponse response;
private SecretKey key; private SecretKey key;
private static final String AUTHORITIES_KEY = "auth";
private static final String MERCHANTID="merchantId"; private static final String MERCHANTID="merchantId";
static final String AUTH_SECRET = "X-Api-Secret"; static final String AUTH_SECRET = "X-Api-Secret";
private final Set<String> invalidatedTokens = new HashSet<>();
private static final String USER_ID = "userId"; private static final String USER_ID = "userId";
public UserEntity validateUser(Map<String, Object> userInfo) { public UserEntity validateUser(Map<String, Object> userInfo) {
@@ -82,7 +96,7 @@ public class TokenProvider {
log.info("JWT Secret Key initialized."); log.info("JWT Secret Key initialized.");
} }
public String createToken(Boolean rememberMe, UserEntity user) { public String createToken(Boolean rememberMe, UserEntity user, Long loginAttemptId) {
// String authorities = authentication.getAuthorities().stream() // String authorities = authentication.getAuthorities().stream()
// .map(GrantedAuthority::getAuthority) // .map(GrantedAuthority::getAuthority)
// .collect(Collectors.joining(",")); // .collect(Collectors.joining(","));
@@ -91,31 +105,31 @@ public class TokenProvider {
Date validity; Date validity;
if (Boolean.TRUE.equals(rememberMe)) { if (Boolean.TRUE.equals(rememberMe)) {
now = DateUtils.addMonths(new Date(), 2).getTime(); now = DateUtils.addDays(new Date(), 2).getTime();
validity = new Date(now); validity = new Date(now);
log.info("Creating token with extended validity for 2 months."); log.info("Creating token with extended validity for 2 days.");
} else { } else {
now = (new Date()).getTime(); now = DateUtils.addSeconds(new Date(), this.tokenValidityInSeconds).getTime();
validity = new Date(now + (this.tokenValidityInSeconds * 1000)); validity = new Date(now);
log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds); log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds);
} }
String payload = user.getEmail(); String payload = user.getEmail();
if(user != null) { if(user != null) {
payload += ":"+user.getId(); payload += ":"+user.getId();
}
if(user != null) {
payload += ":"+user.getHub().getId(); payload += ":"+user.getHub().getId();
} }
String token = Jwts.builder() String token = Jwts.builder()
.setSubject(payload) .setSubject(payload)
.claim("auth", authorities) .claim(GepafinConstant.LOGIN_ATTEMPT_ID, loginAttemptId)
.claim(GepafinConstant.USER_ID, user.getId() != null ? user.getId() : null)
.claim(GepafinConstant.AUTH, authorities)
.signWith(key, SignatureAlgorithm.HS512) .signWith(key, SignatureAlgorithm.HS512)
.setExpiration(validity) .setExpiration(validity)
.compact(); .compact();
response.setHeader("Authorization", "Bearer " + token);
log.debug("Generated token: {}", token); log.debug("Generated token: {}", token);
return token; return token;
} }
@@ -144,31 +158,14 @@ public class TokenProvider {
} }
public boolean validateToken(String authToken) { public boolean validateToken(String authToken) {
try {
if (isTokenInvalid(authToken)) { Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken);
log.warn("Token is invalidated.");
return false;
}
Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(authToken);
log.info("Token is valid."); log.info("Token is valid.");
return true; return true;
} catch (Exception e) {
log.error("Token validation failed: {}", e.getMessage());
return false;
}
} }
public void invalidateToken(String token) {
invalidatedTokens.add(token);
log.info("Token invalidated: {}", token);
}
public boolean isTokenInvalid(String token) {
return invalidatedTokens.contains(token);
}
public Map<String, Object> getUserInfoAndUserIdFromToken(HttpServletRequest request) { public Map<String, Object> getUserInfoAndUserIdFromToken(HttpServletRequest request) {
Map<String, Object> userInfo = new HashMap<>(); Map<String, Object> userInfo = new HashMap<>();
String authSecretHeader=request.getHeader(AUTH_SECRET); String authSecretHeader=request.getHeader(AUTH_SECRET);
@@ -249,4 +246,26 @@ public class TokenProvider {
return null; // Return null if token is not found or not in Bearer format return null; // Return null if token is not found or not in Bearer format
} }
public Claims getClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
}
public String getCurrentActiveUserEmail() {
var authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
String email = userDetails.getUsername();
int lastColonIndex = email.lastIndexOf(":");
int secondLastColonIndex = email.lastIndexOf(":", lastColonIndex - 1);
if (secondLastColonIndex != -1) {
return email.substring(0, secondLastColonIndex);
} else {
return email;
}
}
return null;
}
} }

View File

@@ -156,7 +156,7 @@ public class GepafinConstant {
public static final String IS_PIVA = "isPIVA"; public static final String IS_PIVA = "isPIVA";
public static final String FAILED_RETAIN_FIELD = "failed.retain.field"; public static final String FAILED_RETAIN_FIELD = "failed.retain.field";
public static final String USER_ALREADY_EXIST_MSG = "user.already.exist.msg"; public static final String USER_ALREADY_EXIST_MSG = "user.already.exist.msg";
public static final String TOKEN_VALIDATE_SUCCESS_MSE = "token.validate.success"; public static final String TOKEN_VALIDATE_SUCCESS_MSG = "token.validate.success";
public static final String INVALID_REQUEST = "invalid.request"; public static final String INVALID_REQUEST = "invalid.request";
public static final String CODICE_FISCALE_EXISTS = "codice.fiscale.exists"; public static final String CODICE_FISCALE_EXISTS = "codice.fiscale.exists";
public static final String TOTAL_STEPS_NOT_BE_ZERO = "total.steps.not.zero"; public static final String TOTAL_STEPS_NOT_BE_ZERO = "total.steps.not.zero";
@@ -294,7 +294,16 @@ public class GepafinConstant {
public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate";
public static final String USER_MUST_BE_ASSOCIATED_WITH_COMPANY="user.must.be.associated.with.company.to.create.application"; public static final String USER_MUST_BE_ASSOCIATED_WITH_COMPANY="user.must.be.associated.with.company.to.create.application";
public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call";
public static final String CREATED_DATE = "createdDate";
public static final String RESPONSE_DAYS_NOT_NULL="response.days.not.null";
public static final String APPLICATION_CANNOT_APPROVED_OR_REJECTED="application.cannot.approved.or.rejected";
public static final String SUBMISSION_DATE = "submissionDate"; public static final String SUBMISSION_DATE = "submissionDate";
public static final String ASSIGNED_AT = "assignedAt"; public static final String ASSIGNED_AT = "assignedAt";
public static final String AUTH = "auth";
//Logging
public static final String USER_ID = "userId";
public static final String LOGIN_ATTEMPT_ID = "loginAttemptId";
public static final String USER_ACTION_ID = "userActionId";
} }

View File

@@ -11,11 +11,11 @@ import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.request.AmendmentFormField.AmendmentIsUploadedByEnum;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.service.*;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -34,6 +34,7 @@ import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.time.temporal.ChronoUnit.DAYS;
import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.log;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
@@ -92,6 +93,18 @@ public class ApplicationAmendmentRequestDao {
@Autowired @Autowired
private EmailLogDao emailLogDao; private EmailLogDao emailLogDao;
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
@Autowired
LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
@Autowired
private AssignedApplicationsDao assignedApplicationsDao;
public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) {
log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId);
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId);
@@ -199,11 +212,18 @@ public class ApplicationAmendmentRequestDao {
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity();
applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote());
applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays());
if(applicationAmendmentRequest.getResponseDays()==null || applicationAmendmentRequest.getResponseDays() < 0){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.RESPONSE_DAYS_NOT_NULL));
}
applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()).plusDays(applicationAmendmentRequest.getResponseDays()));
applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail()); applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail());
applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification()); applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification());
applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue()); applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue());
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId);
//cloned for old data entity
ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity);
applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity); applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity);
Long applicationId = applicationEvaluationEntity.getApplicationId(); Long applicationId = applicationEvaluationEntity.getApplicationId();
@@ -223,35 +243,71 @@ public class ApplicationAmendmentRequestDao {
String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean);
applicationAmendmentRequestEntity.setFormFields(formFieldsJson); applicationAmendmentRequestEntity.setFormFields(formFieldsJson);
} }
List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId());
// Ensure startDate and initialDays are not null to avoid NullPointerException
if (amendmentRequest !=null && amendmentRequest.isEmpty() && applicationEvaluationEntity.getStartDate() != null && applicationEvaluationEntity.getInitialDays() != null ) {
Long initialDays = applicationEvaluationEntity.getInitialDays();
LocalDateTime startDate = applicationEvaluationEntity.getStartDate();
LocalDateTime nowInUTC = DateTimeUtil.DateServerToUTC(LocalDateTime.now());
// Calculate remaining days
Long remainingDays = initialDays - DAYS.between(startDate, nowInUTC);
// Set remaining days in the entity
applicationEvaluationEntity.setRemainingDays(remainingDays);
//Set stop date time in the entity becuase amendment has started
applicationEvaluationEntity.setStopDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
}
UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId()); UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId());
Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub());
ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(
applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber,
userEntity.getHub().getId()); userEntity.getHub().getId());
applicationAmendmentRequestEntity.setProtocol(protocolEntity); applicationAmendmentRequestEntity.setProtocol(protocolEntity);
ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity, null, VersionActionTypeEnum.INSERT);
String evaluationStatusType = applicationEvaluationEntity.getStatus(); String evaluationStatusType = applicationEvaluationEntity.getStatus();
if (Boolean.FALSE.equals(evaluationStatusType.equals((ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue())))){ if (Boolean.FALSE.equals(evaluationStatusType.equals((ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue())))){
applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
//Set Status
applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
applicationEvaluationRepository.save(applicationEvaluationEntity); applicationEvaluationRepository.save(applicationEvaluationEntity);
/** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(applicationEvaluationEntity).build());
} }
ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId);
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
String applicationStatusType = applicationEntity.getStatus(); String applicationStatusType = applicationEntity.getStatus();
if (Boolean.FALSE.equals(applicationStatusType.equals((ApplicationStatusTypeEnum.SOCCORSO.getValue())))) { if (Boolean.FALSE.equals(applicationStatusType.equals((ApplicationStatusTypeEnum.SOCCORSO.getValue())))) {
applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue()); applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue());
applicationRepository.save(applicationEntity); applicationRepository.save(applicationEntity);
} }
/** This code is responsible for adding a version history log for the "Update Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(applicationEntity).build());
AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId);
String assignedStatusType = assignedApplicationsEntity.getStatus(); String assignedStatusType = assignedApplicationsEntity.getStatus();
AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity);
if (Boolean.FALSE.equals(assignedStatusType.equals((AssignedApplicationEnum.SOCCORSO.getValue())))) { if (Boolean.FALSE.equals(assignedStatusType.equals((AssignedApplicationEnum.SOCCORSO.getValue())))) {
assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue()); assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue());
assignedApplicationsRepository.save(assignedApplicationsEntity); assignedApplicationsRepository.save(assignedApplicationsEntity);
/** This code is responsible for adding a version history log for the "Update Assigned Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApplication).newData(assignedApplicationsEntity).build());
} }
return applicationAmendment; return applicationAmendment;
} }
public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity,ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity,VersionActionTypeEnum actionTypeEnum) {
ApplicationAmendmentRequestEntity applicationAmendmentRequest = applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); ApplicationAmendmentRequestEntity applicationAmendmentRequest = applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity);
/** This code is responsible for adding a version history log for the "Create Application Amendment" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionTypeEnum).oldData(oldApplicationAmendmentEntity).newData(applicationAmendmentRequestEntity).build());
return applicationAmendmentRequest; return applicationAmendmentRequest;
} }
@@ -282,7 +338,8 @@ public class ApplicationAmendmentRequestDao {
LocalDateTime startDate = entity.getStartDate(); LocalDateTime startDate = entity.getStartDate();
response.setStartDate(startDate); response.setStartDate(startDate);
response.setExpirationDate(startDate.plus(expirationDays, ChronoUnit.DAYS)); response.setExpirationDate(entity.getEndDate());
response.setEvaluationEndDate(entity.getApplicationEvaluationEntity().getEndDate());
response.setIsSendEmail(entity.getIsEmail()); response.setIsSendEmail(entity.getIsEmail());
response.setIsSendNotification(entity.getIsNotification()); response.setIsSendNotification(entity.getIsNotification());
@@ -392,8 +449,9 @@ public class ApplicationAmendmentRequestDao {
public void deleteById(Long id) { public void deleteById(Long id) {
log.info("Deleting assigned application with ID: {}", id); log.info("Deleting assigned application with ID: {}", id);
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id);
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);
applicationAmendmentRequestEntity.setIsDeleted(true); applicationAmendmentRequestEntity.setIsDeleted(true);
saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity,oldApplicationAmendmentEntity,VersionActionTypeEnum.SOFT_DELETE);
log.info(" Application amendment deleted with ID: {}", id); log.info(" Application amendment deleted with ID: {}", id);
} }
@@ -441,6 +499,7 @@ public class ApplicationAmendmentRequestDao {
log.info("Updating application amendement with ID: {}", id); log.info("Updating application amendement with ID: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment);
setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote()); setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote());
Map<String, AmendmentFormField> amendmentFormFieldMap = Utils Map<String, AmendmentFormField> amendmentFormFieldMap = Utils
@@ -457,8 +516,9 @@ public class ApplicationAmendmentRequestDao {
}); });
existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList()));
} }
existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE);
ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment);
log.info("Application Amendment updated successfully: {}", response); log.info("Application Amendment updated successfully: {}", response);
return response; return response;
@@ -570,9 +630,9 @@ public class ApplicationAmendmentRequestDao {
private void setIsUploadedBy(AmendmentFormField amendmentFormField) { private void setIsUploadedBy(AmendmentFormField amendmentFormField) {
if(validator.checkIsBeneficiary()) { if(validator.checkIsBeneficiary()) {
amendmentFormField.setIsUploadedBy(AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue());
}else { }else {
amendmentFormField.setIsUploadedBy(AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue());
} }
} }
@@ -763,43 +823,90 @@ public class ApplicationAmendmentRequestDao {
} }
public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest) { public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest) {
log.info("Closing application amendement with ID: {}", id); log.info("Closing application amendement with ID: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
//cloned entity for old data and versioning
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment);
List<ApplicationAmendmentRequestEntity> amendmentRequestList = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(
existingApplicationAmendment.getApplicationEvaluationEntity().getId()
);
// Check if this is the last amendment being closed
boolean isLastRemaining = amendmentRequestList.stream()
.filter(amendment -> !amendment.getId().equals(id)) // Exclude the current amendment
.allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()));
if (isLastRemaining) {
log.info("The current amendment is the last remaining one to be closed.");
applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(existingApplicationAmendment.getApplicationEvaluationEntity());
}
setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote()); setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote());
setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue());
ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment, oldApplicationAmendmentEntity,
VersionActionTypeEnum.UPDATE);
ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment);
List<ApplicationAmendmentRequestEntity> amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(existingApplicationAmendment.getApplicationEvaluationEntity().getId()); List<ApplicationAmendmentRequestEntity> amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(
Boolean allClosed = amendmentRequests.stream() existingApplicationAmendment.getApplicationEvaluationEntity().getId());
.allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()));
ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId()); ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId());
ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application);
if (Boolean.TRUE.equals(allClosed)) { if (Boolean.TRUE.equals(allClosed)) {
existingApplicationAmendment.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); existingApplicationAmendment.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
if (allClosed) {
ApplicationEvaluationEntity existingApplicationEvaluationEntity = existingApplicationAmendment.getApplicationEvaluationEntity();
ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(existingApplicationEvaluationEntity);
existingApplicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity()); applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity());
application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue());
applicationRepository.save(application); applicationRepository.save(application);
existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue()); existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue());
assignedApplicationsRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity());
AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsDao.validateAssignedApplication(
existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getId());
AssignedApplicationsEntity oldAssignedApplicationData = Utils.getClonedEntityForData(assignedApplicationsEntity);
assignedApplicationsEntity = assignedApplicationsRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity());
/** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity)
.newData(existingApplicationEvaluationEntity).build());
/** This code is responsible for adding a version history log for the "Update Application status" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntityData).newData(application).build());
/** This code is responsible for adding a version history log for the "Update assigned application " operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApplicationData)
.newData(assignedApplicationsEntity).build());
log.info("All amendments are closed. Application Evaluation status set to OPEN."); log.info("All amendments are closed. Application Evaluation status set to OPEN.");
} }
log.info("Application Amendment closed successfully: {}", response); log.info("Application Amendment closed successfully: {}", response);
}
return response; return response;
} }
public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) {
ApplicationAmendmentRequestEntity request = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id);
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
if (newResponseDays != null && newResponseDays > 0) { if (newResponseDays != null && newResponseDays > 0) {
Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L; ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);
request.setResponseDays(currentResponseDays + newResponseDays); Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L;
applicationAmendmentRequestRepository.save(request); applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays);
applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(applicationAmendmentRequestEntity.getResponseDays())));
applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity);
/** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationAmendmentEntity).newData(applicationAmendmentRequestEntity).build());
} }
return convertEntityToResponse(request); return convertEntityToResponse(applicationAmendmentRequestEntity);
} }
public List<ApplicationAmendmentRequestResponse> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId, List<ApplicationAmendmentRequestEnum> statuses) { public List<ApplicationAmendmentRequestResponse> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId, List<ApplicationAmendmentRequestEnum> statuses) {
@@ -835,10 +942,14 @@ public class ApplicationAmendmentRequestDao {
log.info("Updating application amendment with status: {}", id); log.info("Updating application amendment with status: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment);
if (Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) || Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))) { if (Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) || Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))) {
existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue());
existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
applicationAmendmentRequestRepository.save(existingApplicationAmendment); applicationAmendmentRequestRepository.save(existingApplicationAmendment);
/** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationAmendmentEntity).newData(existingApplicationAmendment).build());
} }
ApplicationAmendmentRequestResponse response = convertEntityToResponse(existingApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(existingApplicationAmendment);
log.info("Amendment status updated successfully: {}", response); log.info("Amendment status updated successfully: {}", response);
@@ -846,22 +957,22 @@ public class ApplicationAmendmentRequestDao {
} }
public void sendReminderEmail(Long amendmentId) { public void sendReminderEmail(Long amendmentId) {
ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
Optional<ApplicationEvaluationEntity> entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); Optional<ApplicationEvaluationEntity> entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId());
if (entityOptional.isPresent()) { if (entityOptional.isPresent()) {
ApplicationEntity applicationEntity = applicationService.validateApplication(entityOptional.get().getApplicationId()); ApplicationEntity applicationEntity = applicationService.validateApplication(entityOptional.get().getApplicationId());
UserEntity beneficiaryUser = userService.validateUser(applicationEntity.getUserId()); UserEntity beneficiaryUser = userService.validateUser(applicationEntity.getUserId());
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER, hub, null);
.retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER, hub, null);
String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser); String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser);
String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String body = prepareBody(emailTemplate, amendment, beneficiaryUser);
String email = beneficiaryUser.getEmail(); String email = beneficiaryUser.getEmail();
if (Boolean.TRUE.equals(amendment.getIsEmail()) && email != null && !email.isEmpty()) { if (Boolean.TRUE.equals(amendment.getIsEmail()) && email != null && !email.isEmpty()) {
EmailLogRequest emailLogRequest=emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(),RecipientTypeEnum.USER,beneficiaryUser.getId(),email,beneficiaryUser.getId(),applicationEntity.getId(),amendment.getId(),applicationEntity.getCall().getId()); EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(), RecipientTypeEnum.USER, beneficiaryUser.getId(), email,
beneficiaryUser.getId(), applicationEntity.getId(), amendment.getId(), applicationEntity.getCall().getId());
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest);
} else { } else {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG));
@@ -890,17 +1001,40 @@ public class ApplicationAmendmentRequestDao {
LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays()); LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays());
bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY)); bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY));
} else { } else {
bodyPlaceholders.put("{{amendment_due_date}}", "Not available"); bodyPlaceholders.put("{{amendment_due_date}}", "Not available");
} }
return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders); return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders);
} }
public ApplicationEvaluationEntity calculateEndDateAndSuspensionDays(ApplicationEvaluationEntity applicationEvaluationEntity){
LocalDateTime currentDate=DateTimeUtil.DateServerToUTC(LocalDateTime.now());
LocalDateTime endDate=currentDate.plusDays(applicationEvaluationEntity.getRemainingDays());
Long suspendedDays = ChronoUnit.DAYS.between(applicationEvaluationEntity.getStopDateTime(), currentDate);
ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity);
applicationEvaluationEntity.setEndDate(endDate);
if(applicationEvaluationEntity.getSuspendedDays() == null) {
applicationEvaluationEntity.setSuspendedDays(0L);
}
applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays);
ApplicationEvaluationEntity applicationEvaluation = applicationEvaluationRepository.save(applicationEvaluationEntity);
/** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(applicationEvaluation).build());
return applicationEvaluation;
}
public List<ApplicationAmendmentRequestEntity> getApplicationAmendmentRequestEntitiesByApplicationEvaluationId(Long applicationEvaluationId){
List<ApplicationAmendmentRequestEntity> applicationAmendmentRequestEntities=new ArrayList<>();
applicationAmendmentRequestEntities=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(applicationEvaluationId,ApplicationAmendmentRequestEnum.CLOSE.getValue());
return applicationAmendmentRequestEntities;
}
private void softDeleteDocument(Long documentId) { private void softDeleteDocument(Long documentId) {
documentService.deleteFile(documentId); documentService.deleteFile(documentId);
} }
} }

View File

@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
@@ -9,6 +10,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBea
import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.request.EmailLogRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.AmazonS3Service;
@@ -21,6 +23,7 @@ import net.gepafin.tendermanagement.service.SystemEmailTemplatesService;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.FieldValidator;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -146,12 +149,24 @@ public class ApplicationDao {
@Autowired @Autowired
private EmailLogDao emailLogDao; private EmailLogDao emailLogDao;
@Autowired
private UserWithCompanyRepository userWithCompanyRepository;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
@Autowired
private TokenProvider tokenProvider;
public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) {
FormEntity formEntity = formService.validateForm(formId); FormEntity formEntity = formService.validateForm(formId);
// callService.validatePublishedCall(formEntity.getCall().getId()); // callService.validatePublishedCall(formEntity.getCall().getId());
validateFormFields(applicationRequestBean,formEntity); validateFormFields(applicationRequestBean,formEntity);
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) { if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS));
} }
@@ -160,11 +175,10 @@ public class ApplicationDao {
createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity, formEntity); createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity, formEntity);
return getApplicationById(applicationEntity.getId(),formEntity.getId()); return getApplicationById(applicationEntity.getId(),formEntity.getId());
} }
public void validateDelegation(UserEntity user, CompanyEntity company) { public void validateDelegation(UserEntity user, UserWithCompanyEntity userWithCompany) {
UserWithCompanyEntity userWithCompany = companyService.getUserWithCompanyEntity(user.getId(), company.getId());
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
.findByUserIdAndCompanyIdAndStatus(user.getId(), company.getId(), .findByUserIdAndUserWithCompanyIdAndStatus(user.getId(), userWithCompany.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue()); UserCompanyDelegationStatusEnum.ACTIVE.getValue());
if (!userWithCompany.getIsLegalRepresentant() && userCompanyDelegationEntity == null) { if (!userWithCompany.getIsLegalRepresentant() && userCompanyDelegationEntity == null) {
@@ -187,13 +201,14 @@ public class ApplicationDao {
return applicationFormEntity; return applicationFormEntity;
} }
public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, CompanyEntity companyEntity) { public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, UserWithCompanyEntity userWithCompany) {
validateDelegation(user,companyEntity); validateDelegation(user,userWithCompany);
ApplicationEntity entity = new ApplicationEntity(); ApplicationEntity entity = new ApplicationEntity();
entity.setUserId(user.getId()); entity.setUserId(user.getId());
entity.setCompany(companyEntity); entity.setCompanyId(userWithCompany.getCompanyId());
entity.setCall(call); entity.setCall(call);
entity.setHubId(call.getHub().getId()); entity.setHubId(call.getHub().getId());
entity.setUserWithCompany(userWithCompany);
entity.setIsDeleted(false); entity.setIsDeleted(false);
entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue());
return entity; return entity;
@@ -259,12 +274,21 @@ public class ApplicationDao {
} }
public void deleteById(HttpServletRequest request, Long id) { public void deleteById(HttpServletRequest request, Long id) {
log.info("Deleting application with ID: {}", id); log.info("Deleting application with ID: {}", id);
ApplicationEntity applicationEntity= validateApplication(id); ApplicationEntity applicationEntity= validateApplication(id);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
ApplicationEntity oldApplicationDataEntity = Utils.getClonedEntityForData(applicationEntity);
validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
applicationEntity.setIsDeleted(true); applicationEntity.setIsDeleted(true);
applicationEntity=saveApplicationEntity(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
/** This code is responsible for adding a version history log for the "Delete application" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldApplicationDataEntity).newData(applicationEntity).build());
log.info("Application deleted with ID: {}", id); log.info("Application deleted with ID: {}", id);
} }
@@ -329,7 +353,7 @@ public class ApplicationDao {
predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId)); predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId));
} }
if (companyId != null) { if (companyId != null) {
predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId)); predicate = builder.and(predicate, builder.equal(root.get("companyId"), companyId));
} }
if (statusList != null && !statusList.isEmpty()) { if (statusList != null && !statusList.isEmpty()) {
List<String> statusNames = statusList.stream() List<String> statusNames = statusList.stream()
@@ -361,8 +385,9 @@ public class ApplicationDao {
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
responseBean.setStatus(applicationEntity.getStatus()); responseBean.setStatus(applicationEntity.getStatus());
responseBean.setComments(applicationEntity.getComments()); responseBean.setComments(applicationEntity.getComments());
responseBean.setCompanyId(applicationEntity.getCompany().getId()); responseBean.setCompanyId(applicationEntity.getCompanyId());
responseBean.setCompanyName(applicationEntity.getCompany().getCompanyName()); CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
responseBean.setCompanyName(company.getCompanyName());
if(applicationEntity.getProtocol() != null) { if(applicationEntity.getProtocol() != null) {
responseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber()); responseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber());
} }
@@ -392,41 +417,53 @@ public class ApplicationDao {
} }
private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) { private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) {
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId()); ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId());
ApplicationFormEntity oldApplicationFormEntity = Utils.getClonedEntityForData(applicationFormEntity);
if (applicationFormEntity == null) { if (applicationFormEntity == null) {
applicationFormEntity = createApplicationFormEntity(applicationEntity, formEntity); applicationFormEntity = createApplicationFormEntity(applicationEntity, formEntity);
/** This code is responsible for adding a version history log for the "Create application form" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldApplicationFormEntity).newData(applicationFormEntity)
.build());
} }
return applicationFormEntity; return applicationFormEntity;
} }
public List<ApplicationFormFieldEntity> createOrUpdateMultipleFormFields(List<ApplicationFormFieldRequestBean> formFieldResponseBeans, ApplicationFormEntity applicationFormEntity,FormEntity formEntity) { public List<ApplicationFormFieldEntity> createOrUpdateMultipleFormFields(List<ApplicationFormFieldRequestBean> formFieldResponseBeans,
ApplicationFormEntity applicationFormEntity, FormEntity formEntity) {
List<ApplicationFormFieldEntity> existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); List<ApplicationFormFieldEntity> existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
List<ApplicationFormFieldEntity> applicationFormFieldEntity = formFieldResponseBeans.stream() return formFieldResponseBeans.stream().map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity, existingFields, formEntity))
.map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields,formEntity))
.collect(Collectors.toList()); .collect(Collectors.toList());
return applicationFormFieldEntity;
} }
public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List<ApplicationFormFieldEntity> applicationFormFieldEntities ,FormEntity formEntity) { public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean,
ApplicationFormEntity applicationFormEntity, List<ApplicationFormFieldEntity> applicationFormFieldEntities, FormEntity formEntity) {
ApplicationFormFieldEntity applicationFormFieldEntity=null; ApplicationFormFieldEntity applicationFormFieldEntity = new ApplicationFormFieldEntity();
List<Long> newDocumentIds = validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity); List<Long> newDocumentIds = validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
ApplicationFormFieldEntity oldApplicationFormFieldData = null;
if (applicationFormFieldEntities == null || applicationFormFieldEntities.isEmpty()) { if (applicationFormFieldEntities == null || applicationFormFieldEntities.isEmpty()) {
applicationFormFieldEntity = new ApplicationFormFieldEntity();
applicationFormFieldEntity.setApplicationForm(applicationFormEntity); applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
} else { } else {
for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) { for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) {
if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) {
applicationFormFieldEntity = applicationFormFieldEntity1; applicationFormFieldEntity = applicationFormFieldEntity1;
oldApplicationFormFieldData = Utils.getClonedEntityForData(applicationFormFieldEntity);
if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())) { if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())) {
validateRequiredFields(applicationFormEntity.getForm(), applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId()); validateRequiredFields(applicationFormEntity.getForm(), applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId());
} }
actionType = VersionActionTypeEnum.UPDATE;
break; break;
} else { } else {
applicationFormFieldEntity = new ApplicationFormFieldEntity();
applicationFormFieldEntity.setApplicationForm(applicationFormEntity); applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
} }
} }
@@ -439,10 +476,24 @@ public class ApplicationDao {
} }
if (applicationFormFieldRequestBean.getFieldValue() == null) { if (applicationFormFieldRequestBean.getFieldValue() == null) {
updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean, formEntity, newDocumentIds, null, false); updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean, formEntity, newDocumentIds, null, false);
}
if (applicationFormFieldRequestBean.getFieldValue() != null) {
applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue()));
} else {
applicationFormFieldEntity.setFieldValue(null); applicationFormFieldEntity.setFieldValue(null);
} }
return applicationFormFieldRepository.save(applicationFormFieldEntity);
ApplicationFormFieldEntity applicationFormField = applicationFormFieldRepository.save(applicationFormFieldEntity);
/** This code is responsible for adding a version history log for the "Create update application form" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationFormFieldData).newData(applicationFormField).build());
log.info("Version history logged for action: {}, Field ID: {}", actionType, applicationFormFieldEntity.getFieldId());
return applicationFormField;
} }
void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List<Long> newDocumentIds, void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List<Long> newDocumentIds,
List<String> preInstructorDocumentId,boolean isPreInstructor) { List<String> preInstructorDocumentId,boolean isPreInstructor) {
if (newDocumentIds == null) { if (newDocumentIds == null) {
@@ -505,9 +556,6 @@ public class ApplicationDao {
} }
} }
private List<Long> validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) { private List<Long> validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) {
List<Long> documentIds=null; List<Long> documentIds=null;
// List<ContentResponseBean> contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); // List<ContentResponseBean> contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class);
@@ -570,8 +618,14 @@ public class ApplicationDao {
applicationFormFieldResponseBean.setUpdatedDate(applicationFormFieldEntity.getUpdatedDate()); applicationFormFieldResponseBean.setUpdatedDate(applicationFormFieldEntity.getUpdatedDate());
return applicationFormFieldResponseBean; return applicationFormFieldResponseBean;
} }
public ApplicationEntity saveApplicationEntity(ApplicationEntity application) { public ApplicationEntity saveApplicationEntity(ApplicationEntity application) {
ApplicationEntity applicationEntity = applicationRepository.save(application); ApplicationEntity applicationEntity = applicationRepository.save(application);
/** This code is responsible for adding a version history log for "Create application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(applicationEntity).build());
return applicationEntity; return applicationEntity;
} }
@@ -701,11 +755,12 @@ public class ApplicationDao {
applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
applicationGetResponseBean.setCallId(applicationEntity.getCall().getId()); applicationGetResponseBean.setCallId(applicationEntity.getCall().getId());
applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName()); applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName());
applicationGetResponseBean.setCompanyId(applicationEntity.getCompany().getId()); applicationGetResponseBean.setCompanyId(applicationEntity.getCompanyId());
if(applicationEntity.getProtocol() != null) { if(applicationEntity.getProtocol() != null) {
applicationGetResponseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber()); applicationGetResponseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber());
} }
applicationGetResponseBean.setCompanyName(applicationEntity.getCompany().getCompanyName()); CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
applicationGetResponseBean.setCompanyName(company.getCompanyName());
return applicationGetResponseBean; return applicationGetResponseBean;
} }
@@ -722,25 +777,31 @@ public class ApplicationDao {
public ApplicationResponse createApplicationByCallId(CompanyEntity companyEntity, public ApplicationResponse createApplicationByCallId(CompanyEntity companyEntity,
ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) { ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) {
CallEntity call = callService.validateCall(callId); CallEntity call = callService.validateCall(callId);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId());
// call = callService.validatePublishedCall(call.getId()); // call = callService.validatePublishedCall(call.getId());
checkIfApplicationExists(call, companyEntity, userEntity); checkIfApplicationExists(call, userWithCompanyEntity, userEntity);
ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, companyEntity); ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity);
applicationEntity.setComments(applicationRequest.getComments()); applicationEntity.setComments(applicationRequest.getComments());
applicationEntity = saveApplicationEntity(applicationEntity); applicationEntity = saveApplicationEntity(applicationEntity);
ApplicationResponse applicationResponse = getApplicationResponse(applicationEntity); return getApplicationResponse(applicationEntity);
return applicationResponse;
} }
public void checkIfApplicationExists(CallEntity call, CompanyEntity companyEntity, UserEntity userEntity){ public void checkIfApplicationExists(CallEntity call, UserWithCompanyEntity userWithCompanyEntity, UserEntity userEntity){
Optional<ApplicationEntity> applicationEntity=applicationRepository.findByUserIdAndCompanyIdAndCallIdAndIsDeletedFalse(userEntity.getId(), companyEntity.getId(),call.getId()); Optional<ApplicationEntity> applicationEntity=applicationRepository.findByUserIdAndUserWithCompanyIdAndCallIdAndIsDeletedFalse(userEntity.getId(), userWithCompanyEntity.getId(),call.getId());
if(applicationEntity.isPresent()){ if(applicationEntity.isPresent()){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS)); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS));
} }
} }
public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
//cloned entity for old application data
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); UserEntity userEntity = userService.validateUser(applicationEntity.getUserId());
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) { if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE));
} }
@@ -755,7 +816,12 @@ public class ApplicationDao {
applicationEntity.setProtocol(protocolEntity); applicationEntity.setProtocol(protocolEntity);
applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue());
applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
applicationEntity = saveApplicationEntity(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
/** This code is responsible for adding a version history log for "Update application status" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(applicationEntity).build());
sendMailToUserAndCompany(userEntity, applicationEntity); sendMailToUserAndCompany(userEntity, applicationEntity);
sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity);
applicationEntity.setStatus(status.getValue()); applicationEntity.setStatus(status.getValue());
@@ -763,13 +829,16 @@ public class ApplicationDao {
if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) {
applicationEntity.setStatus(status.getValue()); applicationEntity.setStatus(status.getValue());
} }
applicationEntity = saveApplicationEntity(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) {
/** This code is responsible for adding a version history log for "Update application status" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(applicationEntity).build());
}
return getApplicationResponse(applicationEntity); return getApplicationResponse(applicationEntity);
} }
public Integer calculateProgress(Long totalSteps, Long completedSteps) { public Integer calculateProgress(Long totalSteps, Long completedSteps) {
if (FieldValidator.isNullOrZero(totalSteps)) { if (FieldValidator.isNullOrZero(totalSteps)) {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO));
@@ -838,7 +907,17 @@ public class ApplicationDao {
if (nextApplicationFormEntity != null) { if (nextApplicationFormEntity != null) {
List<ApplicationFormFieldEntity> nextApplicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(nextApplicationFormEntity.getId()); List<ApplicationFormFieldEntity> nextApplicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(nextApplicationFormEntity.getId());
nextApplicationFormFieldEntities.forEach(applicationFormFieldEntityToDelete ->
/** This code is responsible for adding a version history log for "Deleting application form field" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(applicationFormFieldEntityToDelete).build()));
applicationFormFieldRepository.deleteAll(nextApplicationFormFieldEntities); applicationFormFieldRepository.deleteAll(nextApplicationFormFieldEntities);
/** This code is responsible for adding a version history log for the "Deleting next application form" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(nextApplicationFormEntity).build());
applicationFormRepository.delete(nextApplicationFormEntity); applicationFormRepository.delete(nextApplicationFormEntity);
} }
} }
@@ -846,7 +925,7 @@ public class ApplicationDao {
private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity) { private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity) {
CallEntity call =applicationEntity.getCall(); CallEntity call =applicationEntity.getCall();
CompanyEntity company = applicationEntity.getCompany(); CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
ProtocolEntity protocol = applicationEntity.getProtocol(); ProtocolEntity protocol = applicationEntity.getProtocol();
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
@@ -889,7 +968,7 @@ public class ApplicationDao {
recipientEmails.add(contactEmail); recipientEmails.add(contactEmail);
} }
if(Boolean.FALSE.equals(recipientEmails.isEmpty())){ if(Boolean.FALSE.equals(recipientEmails.isEmpty())){
emailLogRequest.setRecipientId(applicationEntity.getCompany().getId()); emailLogRequest.setRecipientId(applicationEntity.getCompanyId());
emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY); emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY);
emailLogRequest.setRecipientEmails(companyEmail); emailLogRequest.setRecipientEmails(companyEmail);
} }
@@ -897,7 +976,7 @@ public class ApplicationDao {
} }
private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) {
CallEntity call = applicationEntity.getCall(); CallEntity call = applicationEntity.getCall();
CompanyEntity company = applicationEntity.getCompany(); CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
ProtocolEntity protocol = applicationEntity.getProtocol(); ProtocolEntity protocol = applicationEntity.getProtocol();
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
@@ -936,30 +1015,44 @@ public class ApplicationDao {
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest);
emailLogRequest.setRecipientEmails(rinaldoEmail); emailLogRequest.setRecipientEmails(rinaldoEmail);
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest);
} }
public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId,
MultipartFile file) { MultipartFile file) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
//cloned entity for old data
ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(applicationEntity);
validateFileTypeForCall(file, applicationEntity); validateFileTypeForCall(file, applicationEntity);
ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository.findByApplicationIdAndStatus(applicationId,
.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
//cloned entity for old data
ApplicationSignedDocumentEntity oldApplicationSingedDocumentData = Utils.getClonedEntityForData(applicationSignedDocument);
if (applicationSignedDocument != null) { if (applicationSignedDocument != null) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED));
// applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); // applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
// applicationSignedDocumentRepository.save(applicationSignedDocument); // applicationSignedDocumentRepository.save(applicationSignedDocument);
} }
UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, applicationEntity.getCall().getId(), applicationId);
applicationEntity.getCall().getId(), applicationId);
applicationSignedDocument = new ApplicationSignedDocumentEntity(); applicationSignedDocument = new ApplicationSignedDocumentEntity();
applicationSignedDocument.setApplication(applicationEntity); applicationSignedDocument.setApplication(applicationEntity);
applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName()); applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName());
applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath());
applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
applicationSignedDocumentRepository.save(applicationSignedDocument); applicationSignedDocument = applicationSignedDocumentRepository.save(applicationSignedDocument);
/** This code is responsible for adding a version history log for the "assign application document" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldApplicationSingedDocumentData)
.newData(applicationSignedDocument).build());
applicationEntity.setStatus(ApplicationStatusTypeEnum.READY.getValue()); applicationEntity.setStatus(ApplicationStatusTypeEnum.READY.getValue());
applicationRepository.save(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
/** This code is responsible for adding a version history log for the "Create Call" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(applicationEntity).build());
return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument);
} }
@@ -983,7 +1076,7 @@ public class ApplicationDao {
} }
private String generateS3PathForDelegation(Long callId, Long applicationId) { private String generateS3PathForDelegation(Long callId, Long applicationId) {
try { try {
return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId); return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG));
} }
@@ -1017,7 +1110,7 @@ public class ApplicationDao {
public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) { public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
@@ -1030,22 +1123,31 @@ public class ApplicationDao {
public void deleteSignedDocument(HttpServletRequest request, Long applicationId) { public void deleteSignedDocument(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
//cloned entity for old data
ApplicationSignedDocumentEntity oldApplicationSignedDocument = Utils.getClonedEntityForData(applicationSignedDocument);
if(applicationSignedDocument == null) { if(applicationSignedDocument == null) {
throw new ResourceNotFoundException(Status.NOT_FOUND, throw new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND)); Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND));
} }
applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
applicationSignedDocumentRepository.save(applicationSignedDocument); applicationSignedDocument = applicationSignedDocumentRepository.save(applicationSignedDocument);
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationSignedDocument).newData(applicationSignedDocument)
.build());
} }
public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); UserEntity userEntity = userService.validateUser(applicationEntity.getUserId());
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS));
} }
@@ -1057,9 +1159,15 @@ public class ApplicationDao {
} }
applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue()); applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue());
applicationEntity = saveApplicationEntity(applicationEntity); applicationEntity = applicationRepository.save(applicationEntity);
/** This code is responsible for adding a version history log for "Update application status or other details" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(applicationEntity).build());
return getApplicationResponse(applicationEntity); return getApplicationResponse(applicationEntity);
} }
public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validateAssignedUser(request, applicationId); validateAssignedUser(request, applicationId);
@@ -1125,7 +1233,7 @@ public class ApplicationDao {
try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) {
String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId); String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L);
for (DocumentEntity document : documents) { for (DocumentEntity document : documents) {
String fileName = Utils.extractFileName(document.getFilePath()); String fileName = Utils.extractFileName(document.getFilePath());
@@ -1133,7 +1241,7 @@ public class ApplicationDao {
} }
if (signedDocument != null) { if (signedDocument != null) {
String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId); String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L);
String signedDocFileName = signedDocument.getFileName(); String signedDocFileName = signedDocument.getFileName();
addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName); addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName);
} }

View File

@@ -4,21 +4,22 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.request.ChecklistRequest;
import net.gepafin.tendermanagement.model.request.CriteriaRequest;
import net.gepafin.tendermanagement.model.request.FieldRequest;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.service.AssignedApplicationsService;
import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -86,6 +87,12 @@ public class ApplicationEvaluationDao {
@Autowired @Autowired
private AssignedApplicationsService assignedApplicationsService; private AssignedApplicationsService assignedApplicationsService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) {
ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity();
@@ -101,6 +108,11 @@ public class ApplicationEvaluationDao {
entity.setNote(req.getNote()); entity.setNote(req.getNote());
entity.setMotivation(req.getMotivation()); entity.setMotivation(req.getMotivation());
entity.setIsDeleted(false); entity.setIsDeleted(false);
entity.setInitialDays(30L);
entity.setRemainingDays(30L);
entity.setSuspendedDays(0L);
entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
entity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(30)));
entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
return entity; return entity;
} }
@@ -135,12 +147,12 @@ public class ApplicationEvaluationDao {
response.setNote(entity.getNote()); response.setNote(entity.getNote());
response.setMotivation(entity.getMotivation()); response.setMotivation(entity.getMotivation());
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus()));
response.setEvaluationEndDate(entity.getEndDate());
response.setCreatedDate(entity.getCreatedDate()); response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate()); response.setUpdatedDate(entity.getUpdatedDate());
} }
private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List<EvaluationCriteriaEntity> evaluationCriterias) { private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List<EvaluationCriteriaEntity> evaluationCriterias) {
List<CriteriaResponse> criteriaResponsesFromEntity = entity.getCriteria() != null ? List<CriteriaResponse> criteriaResponsesFromEntity = entity.getCriteria() != null ?
@@ -416,9 +428,8 @@ public class ApplicationEvaluationDao {
response.setBeneficiary(beneficiary); response.setBeneficiary(beneficiary);
response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null); response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null);
response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null);
response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : null);
response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null);
response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate); response.setCallEndDate(callEndDate);
} }
@@ -431,24 +442,32 @@ public class ApplicationEvaluationDao {
Optional<ApplicationEvaluationEntity> existingEntityOptional = Optional<ApplicationEvaluationEntity> existingEntityOptional =
applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId);
ApplicationEvaluationEntity entity; ApplicationEvaluationEntity entity = null;
Optional<AssignedApplicationsEntity> assignedApplications = Optional<AssignedApplicationsEntity> assignedApplications =
assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId); assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId);
ApplicationEvaluationEntity oldApplicationEvaluation = null;
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
if (existingEntityOptional.isPresent()) { if (existingEntityOptional.isPresent()) {
entity = existingEntityOptional.get(); entity = existingEntityOptional.get();
oldApplicationEvaluation = Utils.getClonedEntityForData(entity);
entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req))));
entity.setChecklist(Utils.convertObjectToJson(filterNonNullChecklist(processChecklist(entity, req)))); entity.setChecklist(Utils.convertObjectToJson(filterNonNullChecklist(processChecklist(entity, req))));
entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req)))); entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req))));
entity.setIsDeleted(false); entity.setIsDeleted(false);
setIfUpdated(entity::getNote, entity::setNote, req.getNote()); setIfUpdated(entity::getNote, entity::setNote, req.getNote());
setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation());
actionType = VersionActionTypeEnum.UPDATE;
} else { } else {
entity = convertToEntity(user, req, assignedApplicationId); entity = convertToEntity(user, req, assignedApplicationId);
actionType = VersionActionTypeEnum.INSERT;
} }
ApplicationStatusForEvaluation status = req.getApplicationStatus(); ApplicationStatusForEvaluation status = req.getApplicationStatus();
ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity);
/** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplicationEvaluation).newData(entity).build());
if (status != null) { if (status != null) {
ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId()); ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId());
AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get(); AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get();
@@ -648,6 +667,7 @@ public class ApplicationEvaluationDao {
response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus()));
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()));
response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null);
response.setEvaluationEndDate(entity.getEndDate());
LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate); response.setCallEndDate(callEndDate);
setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias);
@@ -949,9 +969,8 @@ public class ApplicationEvaluationDao {
response.setBeneficiary(beneficiary); response.setBeneficiary(beneficiary);
response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null);
response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : null);
response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null);
response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
} }
private Optional<ApplicationFormFieldEntity> findFormFieldValue(Long applicationId, String formFieldId) { private Optional<ApplicationFormFieldEntity> findFormFieldValue(Long applicationId, String formFieldId) {
@@ -1305,13 +1324,21 @@ public class ApplicationEvaluationDao {
public void deleteById(Long id) { public void deleteById(Long id) {
ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(id); ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(id);
ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(applicationEvaluationEntity);
applicationEvaluationEntity.setIsDeleted(true); applicationEvaluationEntity.setIsDeleted(true);
saveApplicationEvaluationEntity(applicationEvaluationEntity); saveApplicationEvaluationEntity(applicationEvaluationEntity, oldApplicationEvaluation);
} }
public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData) { public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData, ApplicationEvaluationEntity oldApplicationEvaluation) {
return applicationEvaluationRepository.save(applicationEvaluationEntityData); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.save(applicationEvaluationEntityData);
/** This code is responsible for adding a version history log for the "Delete Application Evaluation" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldApplicationEvaluation).newData(applicationEvaluationEntityData)
.build());
return applicationEvaluationEntity;
} }
public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity,
@@ -1326,8 +1353,16 @@ public class ApplicationEvaluationDao {
ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); ApplicationEvaluationEntity existingEntity = existingEntityOptional.get();
// UserEntity userEntity = userService.validateUser(application.getUserId()); // UserEntity userEntity = userService.validateUser(application.getUserId());
// callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId()); // callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId());
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application);
application.setStatus(newStatus.getValue()); application.setStatus(newStatus.getValue());
application = applicationRepository.save(application); application = applicationRepository.save(application);
/** This code is responsible for adding a version history log for the "Update Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(application).build());
ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity);
AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity);
String statusType = application.getStatus(); String statusType = application.getStatus();
if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) {
existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue());
@@ -1336,11 +1371,21 @@ public class ApplicationEvaluationDao {
entity = applicationEvaluationRepository.save(existingEntity); entity = applicationEvaluationRepository.save(existingEntity);
assignedApplicationsRepository.save(assignedApplicationsEntity); assignedApplicationsRepository.save(assignedApplicationsEntity);
List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) {
for (ApplicationAmendmentRequestEntity request : amendmentRequest) {
request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); /** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluation).newData(entity).build());
/** This code is responsible for adding a version history log for the "Update Assigned Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApplication).newData(assignedApplicationsEntity).build());
} }
applicationAmendmentRequestRepository.saveAll(amendmentRequest);
List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue());
if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED));
}
if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) {
emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application);
} }

View File

@@ -1,21 +1,31 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity;
import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.FaqEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum;
import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse;
import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.ResourceNotFoundException;
@@ -26,6 +36,7 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.log;
@@ -48,9 +59,22 @@ public class AssignedApplicationsDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired @Autowired
private ApplicationEvaluationDao applicationEvaluationDao; private ApplicationEvaluationDao applicationEvaluationDao;
@Autowired
private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
@Autowired
private ApplicationEvaluationRepository applicationEvaluationRepository;
public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) {
log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId); log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId);
@@ -67,12 +91,17 @@ public class AssignedApplicationsDao {
Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS)
); );
} }
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application);
application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue());
applicationRepository.save(application); applicationRepository.save(application);
/** This code is responsible for adding a version history log for the "Update Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(application).build());
UserEntity user = userService.validateUser(userId); UserEntity user = userService.validateUser(userId);
AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest);
applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignment.getId());
AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment);
applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignApplicationToInstructorResponse.getId());
log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse);
return assignApplicationToInstructorResponse; return assignApplicationToInstructorResponse;
} }
@@ -89,12 +118,18 @@ public class AssignedApplicationsDao {
assignApplication.setNote(assignedApplicationsRequest.getNote()); assignApplication.setNote(assignedApplicationsRequest.getNote());
assignApplication.setIsDeleted(false); assignApplication.setIsDeleted(false);
assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication);
AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication, null, VersionActionTypeEnum.INSERT);
return assignedApplicationsEntity; return assignedApplicationsEntity;
} }
public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity){
public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity, AssignedApplicationsEntity oldAssignedApplicationEntity, VersionActionTypeEnum actionTypeEnum) {
AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.save(assignedApplicationsEntity); AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.save(assignedApplicationsEntity);
/** This code is responsible for adding a version history log for the "Create Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionTypeEnum).oldData(oldAssignedApplicationEntity).newData(assignedApplication).build());
return assignedApplication; return assignedApplication;
} }
@@ -105,6 +140,7 @@ public class AssignedApplicationsDao {
ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId());
String callName = application.getCall() != null ? application.getCall().getName() : ""; String callName = application.getCall() != null ? application.getCall().getName() : "";
Optional<ApplicationEvaluationEntity> applicationEvaluationEntity=applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(application.getId());
LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callEndDate = application.getCall().getEndDate();
LocalDateTime callStartDate = application.getCall().getStartDate(); LocalDateTime callStartDate = application.getCall().getStartDate();
@@ -131,12 +167,15 @@ public class AssignedApplicationsDao {
assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt()); assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt());
assignedApplicationsResponse.setProtocolNumber(protocolNumber); assignedApplicationsResponse.setProtocolNumber(protocolNumber);
assignedApplicationsResponse.setCallName(callName); assignedApplicationsResponse.setCallName(callName);
assignedApplicationsResponse.setCompanyName(application.getCompany().getCompanyName()); CompanyEntity company=companyService.validateCompany(application.getCompanyId());
assignedApplicationsResponse.setCompanyName(company.getCompanyName());
assignedApplicationsResponse.setBeneficiaryName(beneficiaryName); assignedApplicationsResponse.setBeneficiaryName(beneficiaryName);
assignedApplicationsResponse.setSubmissionDate(submissionDate); assignedApplicationsResponse.setSubmissionDate(submissionDate);
assignedApplicationsResponse.setCallEndDate(callEndDate); assignedApplicationsResponse.setCallEndDate(callEndDate);
assignedApplicationsResponse.setCallStartDate(callStartDate); assignedApplicationsResponse.setCallStartDate(callStartDate);
if(applicationEvaluationEntity.isPresent()){
assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate());
}
return assignedApplicationsResponse; return assignedApplicationsResponse;
} }
@@ -150,8 +189,9 @@ public class AssignedApplicationsDao {
log.info("Deleting assigned application with ID: {}", id); log.info("Deleting assigned application with ID: {}", id);
AssignedApplicationsEntity assignedApplicationsEntity = validateAssignedApplication(id); AssignedApplicationsEntity assignedApplicationsEntity = validateAssignedApplication(id);
validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId());
AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplicationsEntity);
assignedApplicationsEntity.setIsDeleted(true); assignedApplicationsEntity.setIsDeleted(true);
assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); assignedApplicationsEntity = saveAssignedApplication(assignedApplicationsEntity, oldAssignedApplicationEntity, VersionActionTypeEnum.SOFT_DELETE);
log.info("Assigned Application deleted with ID: {}", id); log.info("Assigned Application deleted with ID: {}", id);
} }
@@ -191,13 +231,16 @@ public class AssignedApplicationsDao {
log.info("Updating assigned application with ID: {}", id); log.info("Updating assigned application with ID: {}", id);
AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id);
validator.validatePreInstructor(request, existingAssignment.getUserId()); validator.validatePreInstructor(request, existingAssignment.getUserId());
AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(existingAssignment);
setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote());
setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name());
setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId());
existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment, oldAssignedApplicationEntity, VersionActionTypeEnum.UPDATE);
AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment); AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment);
log.info("Assigned application updated successfully: {}", response); log.info("Assigned application updated successfully: {}", response);
return response; return response;

View File

@@ -2,13 +2,21 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.BeneficiaryPreferredCallEntity; import net.gepafin.tendermanagement.entities.BeneficiaryPreferredCallEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean;
import net.gepafin.tendermanagement.repositories.BeneficiaryPreferredCallRepository; import net.gepafin.tendermanagement.repositories.BeneficiaryPreferredCallRepository;
import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.ResourceNotFoundException;
@@ -36,26 +44,41 @@ public class BeneficiaryPreferredCallDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private UserWithCompanyRepository userWithCompanyRepository;
@Autowired
private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest httpServletRequest;
public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request, UserEntity user) { public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request, UserEntity user) {
log.info("Creating new beneficiary preferred call with details: {}", request); log.info("Creating new beneficiary preferred call with details: {}", request);
validator.validateUserWithCompany(httpServletRequest, request.getCompanyId()); validator.validateUserWithCompany(httpServletRequest, request.getCompanyId());
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(), request.getCompanyId());
Optional<BeneficiaryPreferredCallEntity> existingCall = beneficiaryPreferredCallRepository Optional<BeneficiaryPreferredCallEntity> existingCall = beneficiaryPreferredCallRepository
.findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(user.getId(), request.getCallId(), request.getCompanyId()); .findByUserIdAndCallIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), request.getCallId(), userWithCompanyEntity.getId());
if (existingCall.isPresent()) { if (existingCall.isPresent()) {
log.warn("Duplicate beneficiary preferred call detected: {}", existingCall.get()); log.warn("Duplicate beneficiary preferred call detected: {}", existingCall.get());
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DUPLICATE_BENEFICIARY_CALL)); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DUPLICATE_BENEFICIARY_CALL));
} }
BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request, user); BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request, user,userWithCompanyEntity);
entity = beneficiaryPreferredCallRepository.save(entity); entity = beneficiaryPreferredCallRepository.save(entity);
/** This code is responsible for adding a version history log for "Create Beneficiary Preferred Call" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build());
log.info("Beneficiary preferred call created with ID: {}", entity.getId()); log.info("Beneficiary preferred call created with ID: {}", entity.getId());
return convertEntityToResponse(entity); return convertEntityToResponse(entity);
} }
private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity) { private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity,UserWithCompanyEntity userWithCompanyEntity) {
BeneficiaryPreferredCallEntity entity = new BeneficiaryPreferredCallEntity(); BeneficiaryPreferredCallEntity entity = new BeneficiaryPreferredCallEntity();
if (userEntity.getBeneficiary()!=null) { if (userEntity.getBeneficiary()!=null) {
entity.setBeneficiaryId(userEntity.getBeneficiary().getId()); entity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -63,7 +86,8 @@ public class BeneficiaryPreferredCallDao {
entity.setStatus(BeneficiaryCallStatus.ENABLED.getValue()); entity.setStatus(BeneficiaryCallStatus.ENABLED.getValue());
entity.setCallId(request.getCallId()); entity.setCallId(request.getCallId());
entity.setUserId(userEntity.getId()); entity.setUserId(userEntity.getId());
entity.setCompanyId(request.getCompanyId()); entity.setCompanyId(userWithCompanyEntity.getCompanyId());
entity.setUserWithCompany(userWithCompanyEntity);
entity.setIsDeleted( false); entity.setIsDeleted( false);
return entity; return entity;
} }
@@ -92,8 +116,14 @@ public class BeneficiaryPreferredCallDao {
log.info("Soft deleting beneficiary preferred call with ID: {}", id); log.info("Soft deleting beneficiary preferred call with ID: {}", id);
BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id);
validator.validateUserId(request, entity.getUserId()); validator.validateUserId(request, entity.getUserId());
BeneficiaryPreferredCallEntity oldBeneficiaryPreferredCallEntity = Utils.getClonedEntityForData(entity);
entity.setIsDeleted(true); entity.setIsDeleted(true);
beneficiaryPreferredCallRepository.save(entity); beneficiaryPreferredCallRepository.save(entity);
/** This code is responsible for adding a version history log for the "Delete Beneficiary Preferred Call" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldBeneficiaryPreferredCallEntity).newData(entity).build());
log.info("Beneficiary preferred call soft deleted with ID: {}", id); log.info("Beneficiary preferred call soft deleted with ID: {}", id);
} }
@@ -122,6 +152,7 @@ public class BeneficiaryPreferredCallDao {
response.setCallId(entity.getCallId()); response.setCallId(entity.getCallId());
response.setUserId(entity.getUserId()); response.setUserId(entity.getUserId());
response.setCompanyId(entity.getCompanyId()); response.setCompanyId(entity.getCompanyId());
response.setUserWithCompanyId(entity.getUserWithCompany().getId());
response.setCreatedDate(entity.getCreatedDate()); response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate()); response.setUpdatedDate(entity.getUpdatedDate());
@@ -130,13 +161,18 @@ public class BeneficiaryPreferredCallDao {
public void updateBeneficiaryPreferredCallStatus(Long id, BeneficiaryCallStatus status) { public void updateBeneficiaryPreferredCallStatus(Long id, BeneficiaryCallStatus status) {
log.info("Updating status for beneficiary preferred call with ID: {}", id); log.info("Updating status for beneficiary preferred call with ID: {}", id);
BeneficiaryPreferredCallEntity existingEntity = validateBeneficiaryPreferredCall(id); BeneficiaryPreferredCallEntity existingEntity = validateBeneficiaryPreferredCall(id);
BeneficiaryPreferredCallEntity oldBeneficiaryPreferredCallEntity = Utils.getClonedEntityForData(existingEntity);
existingEntity.setStatus(status.getValue()); existingEntity.setStatus(status.getValue());
beneficiaryPreferredCallRepository.save(existingEntity); beneficiaryPreferredCallRepository.save(existingEntity);
/** This code is responsible for adding a version history log for the "Update Application" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.UPDATE).oldData(oldBeneficiaryPreferredCallEntity).newData(existingEntity).build());
log.info("Beneficiary preferred call status updated with ID: {}", existingEntity.getId()); log.info("Beneficiary preferred call status updated with ID: {}", existingEntity.getId());
} }
public List<BeneficiaryPreferredCallResponseBean> getBeneficiaryPreferredCallByUserId(UserEntity userEntity, Long companyId) { public List<BeneficiaryPreferredCallResponseBean> getBeneficiaryPreferredCallByUserId(UserEntity userEntity, Long companyId) {
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
List<BeneficiaryPreferredCallEntity> calls = beneficiaryPreferredCallRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId); List<BeneficiaryPreferredCallEntity> calls = beneficiaryPreferredCallRepository.findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(userEntity.getId(), userWithCompanyEntity.getId());
return calls.stream() return calls.stream()
.map(this::convertEntityToResponse) .map(this::convertEntityToResponse)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -15,15 +15,19 @@ import java.util.zip.ZipOutputStream;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.service.*;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import org.h2.util.IOUtils; import org.h2.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
@@ -95,15 +99,21 @@ public class CallDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) {
createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId());
CallEntity callEntity = convertToCallEntity(createCallRequest, userEntity); CallEntity callEntity = convertToCallEntity(createCallRequest, userEntity);
updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ);
updateLookUpData(callEntity, createCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO);
convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity,
LookUpDataTypeEnum.AIMED_TO);
CallResponse createCallResponseBean = getCallResponseBean(callEntity); CallResponse createCallResponseBean = getCallResponseBean(callEntity);
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1);
@@ -120,7 +130,7 @@ public class CallDao {
ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) {
for (DocumentEntity document : documents) { for (DocumentEntity document : documents) {
String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L); String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L);
try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) {
String fileName = Utils.extractFileName(document.getFilePath()); String fileName = Utils.extractFileName(document.getFilePath());
ZipEntry zipEntry = new ZipEntry(fileName); ZipEntry zipEntry = new ZipEntry(fileName);
@@ -180,6 +190,9 @@ public class CallDao {
callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime())); callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime()));
callEntity.setHub(userEntity.getHub()); callEntity.setHub(userEntity.getHub());
callEntity = callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "Create Call" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(callEntity).build());
return callEntity; return callEntity;
} }
@@ -197,40 +210,63 @@ public class CallDao {
List<EvaluationCriteriaEntity> evaluationCriteriaEntities = criteriaReqList.stream() List<EvaluationCriteriaEntity> evaluationCriteriaEntities = criteriaReqList.stream()
.map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList()); .map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList());
evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities);
return evaluationCriteriaEntities; return evaluationCriteriaEntities;
} }
private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) {
EvaluationCriteriaEntity oldEvaluationCriteriaEntity = Utils.getClonedEntityForData(evaluationCriteriaEntity);
evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaEntity.setIsDeleted(true);
evaluationCriteriaRepository.save(evaluationCriteriaEntity); evaluationCriteriaRepository.save(evaluationCriteriaEntity);
/** This code is responsible for adding a version history log for the "soft delete evaluation criteria" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldEvaluationCriteriaEntity).newData(evaluationCriteriaEntity).build());
List<CriteriaFormFieldEntity> list = criteriaFormFieldRepository List<CriteriaFormFieldEntity> list = criteriaFormFieldRepository
.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId());
.stream()
.peek(data -> data.setIsDeleted(Boolean.TRUE)) if(Boolean.FALSE.equals(CollectionUtils.isEmpty(list))) {
.toList();
list.stream().peek(data->{
CriteriaFormFieldEntity oldCriteriaFormFieldEntity = Utils.getClonedEntityForData(data);
data.setIsDeleted(Boolean.TRUE);
/** This code is responsible for adding a version history log for the "soft delete criteria form field" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCriteriaFormFieldEntity).newData(data).build());
});
criteriaFormFieldRepository.saveAll(list); criteriaFormFieldRepository.saveAll(list);
}
} }
private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq,
CallEntity callEntity, LookUpDataTypeEnum type) { CallEntity callEntity, LookUpDataTypeEnum type) {
EvaluationCriteriaEntity criteriaEntity = null; EvaluationCriteriaEntity criteriaEntity = null;
EvaluationCriteriaEntity oldCriteriaEntity = null;
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(criteriaReq, type); LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(criteriaReq, type);
if (criteriaReq.getId() != null && criteriaReq.getId() > 0) { if (criteriaReq.getId() != null && criteriaReq.getId() > 0) {
criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId()) criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId())
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
oldCriteriaEntity = Utils.getClonedEntityForData(oldCriteriaEntity);
actionType = VersionActionTypeEnum.UPDATE;
} else { } else {
criteriaEntity = new EvaluationCriteriaEntity(); criteriaEntity = new EvaluationCriteriaEntity();
criteriaEntity.setCall(callEntity); criteriaEntity.setCall(callEntity);
criteriaEntity.setLookupData(lookupDataEntity); criteriaEntity.setLookupData(lookupDataEntity);
criteriaEntity.setScore(0L); criteriaEntity.setScore(0L);
criteriaEntity.setIsDeleted(false); criteriaEntity.setIsDeleted(false);
actionType = VersionActionTypeEnum.INSERT;
} }
setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore()); setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore());
if (Boolean.FALSE.equals(criteriaEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { if (Boolean.FALSE.equals(criteriaEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) {
criteriaEntity.setLookupData(lookupDataEntity); criteriaEntity.setLookupData(lookupDataEntity);
} }
criteriaEntity = evaluationCriteriaRepository.save(criteriaEntity) ;
/** This code is responsible for adding a version history log for the "create or update evaluation criteria" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldCriteriaEntity).newData(criteriaEntity).build());
return criteriaEntity; return criteriaEntity;
} }
@@ -251,13 +287,18 @@ public class CallDao {
.forEach(this::softDeleteDocument); .forEach(this::softDeleteDocument);
List<DocumentEntity> documentEntities = documentReqList.stream() List<DocumentEntity> documentEntities = documentReqList.stream()
.map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList()); .map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList());
documentRepository.saveAll(documentEntities); // documentRepository.saveAll(documentEntities);
return documentEntities; return documentEntities;
} }
private void softDeleteDocument(DocumentEntity documentEntity) { private void softDeleteDocument(DocumentEntity documentEntity) {
DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity);
documentEntity.setIsDeleted(true); documentEntity.setIsDeleted(true);
documentRepository.save(documentEntity); documentEntity = documentRepository.save(documentEntity);
/** This code is responsible for adding a version history log for the "soft delete for document" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldDocumentEntity).newData(documentEntity).build());
} }
@@ -380,32 +421,37 @@ public class CallDao {
return createCallResponseBean; return createCallResponseBean;
} }
public List<LookUpDataResponse> convertLookUpDataEntities(List<LookUpDataReq> lookUpData, CallEntity callEntity, // public List<LookUpDataResponse> convertLookUpDataEntities(List<LookUpDataReq> lookUpData, CallEntity callEntity,
LookUpDataEntity.LookUpDataTypeEnum type) { // LookUpDataEntity.LookUpDataTypeEnum type) {
if(lookUpData == null) { // if(lookUpData == null) {
return null; // return null;
} // }
List<LookUpDataEntity> lookUpDataEntities = lookUpData.stream() // List<LookUpDataEntity> lookUpDataEntities = lookUpData.stream()
.map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList()); // .map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList());
//
// return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities);
// }
return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities); // private List<LookUpDataResponse> createCallTargetAudienceCheckList(CallEntity callEntity,
} // List<LookUpDataEntity> lookUpDataEntities) {
// List<LookUpDataResponse> lookUpDataResponses = new ArrayList<>();
private List<LookUpDataResponse> createCallTargetAudienceCheckList(CallEntity callEntity, // for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) {
List<LookUpDataEntity> lookUpDataEntities) { // CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity();
List<LookUpDataResponse> lookUpDataResponses = new ArrayList<>(); // callTargetAudienceChecklistEntity.setIsValidated(false);
for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) { // callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity);
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity(); // callTargetAudienceChecklistEntity.setCall(callEntity);
callTargetAudienceChecklistEntity.setIsValidated(false); // callTargetAudienceChecklistEntity.setIsDeleted(false);
callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); // callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository
callTargetAudienceChecklistEntity.setCall(callEntity); // .save(callTargetAudienceChecklistEntity);
callTargetAudienceChecklistEntity.setIsDeleted(false); // versionHistoryRequest.setOldData(null);
callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository // versionHistoryRequest.setNewData(callTargetAudienceChecklistEntity);
.save(callTargetAudienceChecklistEntity); // versionHistoryRequest.setActionType(VersionActionTypeEnum.INSERT);
lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); // versionHistoryRequest.setRequest(request);
} // loggingUtil.addVersionHistory(versionHistoryRequest);
return lookUpDataResponses; // lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity));
} // }
// return lookUpDataResponses;
// }
public LookUpDataResponse convertToLookUpDataResponseBean( public LookUpDataResponse convertToLookUpDataResponseBean(
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) {
@@ -433,8 +479,9 @@ public class CallDao {
BeneficiaryPreferredCallEntity preferredCall; BeneficiaryPreferredCallEntity preferredCall;
if (companyId != null) { if (companyId != null) {
validator.validateUserWithCompany(request, companyId); validator.validateUserWithCompany(request, companyId);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
preferredCall = beneficiaryPreferredCallRepository preferredCall = beneficiaryPreferredCallRepository
.findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(userId, callId, companyId) .findByUserIdAndCallIdAndUserWithCompanyIdAndIsDeletedFalse(userId, callId, userWithCompanyEntity.getId())
.orElse(null); .orElse(null);
} else { } else {
preferredCall = beneficiaryPreferredCallRepository preferredCall = beneficiaryPreferredCallRepository
@@ -453,8 +500,14 @@ public class CallDao {
public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) { public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) {
// validateUpdate(callEntity); // validateUpdate(callEntity);
if(createCallRequest.getThreshold() != null && Boolean.FALSE.equals(createCallRequest.getThreshold().equals(callEntity.getThreshold()))) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold());
callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "update call step 2" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build());
}
convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA);
convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT);
@@ -463,14 +516,6 @@ public class CallDao {
updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST);
// List<FaqEntity> faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId());
// List<LookUpDataResponse> amiedTo = callTargetAudienceChecklistRepository
// .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream()
// .map(this::convertToLookUpDataResponseBean).toList();
// createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities,
// documentEntities, faqEntities, imageEntities);
// createCallResponseBean.setAimedTo(amiedTo);
// createCallResponseBean.setCheckList(checkList);
CallResponse createCallResponseBean = getCallResponseBean(callEntity); CallResponse createCallResponseBean = getCallResponseBean(callEntity);
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2);
return createCallResponseBean; return createCallResponseBean;
@@ -512,6 +557,7 @@ public class CallDao {
} }
public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
isValidDateRange(updateCallRequest, callEntity); isValidDateRange(updateCallRequest, callEntity);
setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName());
setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort,
@@ -547,6 +593,11 @@ public class CallDao {
setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime())); setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime()));
setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime()));
setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi());
callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "update call step 1" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build());
updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO);
updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ); updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ);
CallResponse createCallResponseBean = getCallResponseBean(callEntity); CallResponse createCallResponseBean = getCallResponseBean(callEntity);
@@ -555,8 +606,14 @@ public class CallDao {
} }
private void softDeleteFaq(FaqEntity faqEntity) { private void softDeleteFaq(FaqEntity faqEntity) {
FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
faqEntity.setIsDeleted(true); faqEntity.setIsDeleted(true);
faqRepository.save(faqEntity); faqRepository.save(faqEntity);
/** This code is responsible for adding a version history log for the "soft delete faq" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFaqEntity).newData(faqEntity).build());
} }
private void updateLookUpData(CallEntity callEntity, List<LookUpDataReq> lookupDataReqList, LookUpDataTypeEnum type) { private void updateLookUpData(CallEntity callEntity, List<LookUpDataReq> lookupDataReqList, LookUpDataTypeEnum type) {
@@ -576,6 +633,8 @@ public class CallDao {
private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity, private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity,
LookUpDataTypeEnum type) { LookUpDataTypeEnum type) {
CallTargetAudienceChecklistEntity checklistEntity = null; CallTargetAudienceChecklistEntity checklistEntity = null;
CallTargetAudienceChecklistEntity oldChecklistEntity = null;
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(lookUpDataReq, type); LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(lookUpDataReq, type);
if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) {
checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId()) checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId())
@@ -585,21 +644,31 @@ public class CallDao {
if (Boolean.FALSE.equals(checklistEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) { if (Boolean.FALSE.equals(checklistEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) {
checklistEntity.setLookupData(lookupDataEntity); checklistEntity.setLookupData(lookupDataEntity);
} }
oldChecklistEntity = Utils.getClonedEntityForData(checklistEntity);
actionType = VersionActionTypeEnum.UPDATE;
} else { } else {
checklistEntity = new CallTargetAudienceChecklistEntity(); checklistEntity = new CallTargetAudienceChecklistEntity();
checklistEntity.setCall(callEntity); checklistEntity.setCall(callEntity);
checklistEntity.setLookupData(lookupDataEntity); checklistEntity.setLookupData(lookupDataEntity);
checklistEntity.setIsValidated(false); checklistEntity.setIsValidated(false);
checklistEntity.setIsDeleted(false); checklistEntity.setIsDeleted(false);
actionType = VersionActionTypeEnum.INSERT;
} }
callTargetAudienceChecklistRepository.save(checklistEntity); checklistEntity = callTargetAudienceChecklistRepository.save(checklistEntity);
/** This code is responsible for adding a version history log for the "create or update aimedTo Checklist" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldChecklistEntity).newData(checklistEntity).build());
} }
private void softDeleteCallTargetAudienceChecklist( private void softDeleteCallTargetAudienceChecklist(
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) {
CallTargetAudienceChecklistEntity oldCallTargetAudienceChecklistEntity = Utils.getClonedEntityForData(callTargetAudienceChecklistEntity);
callTargetAudienceChecklistEntity.setIsDeleted(true); callTargetAudienceChecklistEntity.setIsDeleted(true);
callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity);
/** This code is responsible for adding a version history log for the "soft delete for aimedTo or Checklist" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCallTargetAudienceChecklistEntity).newData(callTargetAudienceChecklistEntity).build());
} }
public CallDetailsResponseBean convertToCallDetailsResponseBean(CallEntity callEntity) { public CallDetailsResponseBean convertToCallDetailsResponseBean(CallEntity callEntity) {
@@ -670,8 +739,9 @@ public class CallDao {
if (Boolean.TRUE.equals(onlyPreferredCall)) { if (Boolean.TRUE.equals(onlyPreferredCall)) {
validator.validateUserWithCompany(request, companyId); validator.validateUserWithCompany(request, companyId);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
List<BeneficiaryPreferredCallEntity> preferredCalls = beneficiaryPreferredCallRepository List<BeneficiaryPreferredCallEntity> preferredCalls = beneficiaryPreferredCallRepository
.findByUserIdAndCompanyIdAndIsDeletedFalse(user.getId(), companyId); .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId());
List<Long> preferredCallIds = preferredCalls.stream() List<Long> preferredCallIds = preferredCalls.stream()
.map(BeneficiaryPreferredCallEntity::getCallId) .map(BeneficiaryPreferredCallEntity::getCallId)
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -699,10 +769,11 @@ public class CallDao {
public Map<String, BeneficiaryPreferredCallEntity> getBeneficiaryPreferredCallsForUser(HttpServletRequest request, UserEntity user, List<Long> callIds, Long companyId) { public Map<String, BeneficiaryPreferredCallEntity> getBeneficiaryPreferredCallsForUser(HttpServletRequest request, UserEntity user, List<Long> callIds, Long companyId) {
List<BeneficiaryPreferredCallEntity> beneficiaryPreferredCalls; List<BeneficiaryPreferredCallEntity> beneficiaryPreferredCalls;
if (companyId != null) { if (companyId != null && Boolean.TRUE.equals(validator.checkIsBeneficiary())) {
validator.validateUserWithCompany(request, companyId); validator.validateUserWithCompany(request, companyId);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
beneficiaryPreferredCalls = beneficiaryPreferredCallRepository beneficiaryPreferredCalls = beneficiaryPreferredCallRepository
.findByUserIdAndCallIdInAndCompanyIdAndIsDeletedFalse(user.getId(), callIds, companyId); .findByUserIdAndCallIdInAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), callIds, userWithCompanyEntity.getId());
} else { } else {
beneficiaryPreferredCalls = beneficiaryPreferredCallRepository beneficiaryPreferredCalls = beneficiaryPreferredCallRepository
.findByUserIdAndCallIdInAndIsDeletedFalse(user.getId(), callIds); .findByUserIdAndCallIdInAndIsDeletedFalse(user.getId(), callIds);
@@ -727,13 +798,18 @@ public class CallDao {
public CallResponse validateCallData(CallEntity callEntity) { public CallResponse validateCallData(CallEntity callEntity) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
validateUpdate(callEntity); validateUpdate(callEntity);
CallResponse callResponseBean = getCallResponseBean(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity);
FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId()); FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId());
List<FormResponseBean> formResponseBean = formDao.getFormsByCallId(callEntity); List<FormResponseBean> formResponseBean = formDao.getFormsByCallId(callEntity);
CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean); CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean);
callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue());
callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "validate call" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build());
callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST);
callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus()));
return callResponseBean; return callResponseBean;
@@ -747,10 +823,15 @@ public class CallDao {
// } // }
public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) { public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus());
validateStatusChange(currentStatus, statusReq); validateStatusChange(currentStatus, statusReq);
callEntity.setStatus(statusReq.getValue()); callEntity.setStatus(statusReq.getValue());
callEntity = callRepository.save(callEntity); callEntity = callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "update call status" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build());
return convertToCallResponseBean(callEntity); return convertToCallResponseBean(callEntity);
} }

View File

@@ -5,14 +5,19 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
import net.gepafin.tendermanagement.entities.CommunicationEntity; import net.gepafin.tendermanagement.entities.CommunicationEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse;
import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean;
import net.gepafin.tendermanagement.repositories.CommunicationRepository; import net.gepafin.tendermanagement.repositories.CommunicationRepository;
import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -34,24 +39,41 @@ public class CommunicationDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationReq, Long amendmentId) { public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationReq, Long amendmentId) {
log.info("Adding communication request..."); log.info("Adding communication request...");
CommunicationEntity communicationEntity = convertToCommunicationCommentEntity(communicationReq, amendmentId); CommunicationEntity communicationEntity = convertToCommunicationCommentEntity(communicationReq, amendmentId);
communicationEntity = communicationRepository.save(communicationEntity); communicationEntity = communicationRepository.save(communicationEntity);
/** This code is responsible for adding a version history log for the "adding comment to amendment request" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(communicationEntity).build());
log.info("Added comment: {}", communicationEntity); log.info("Added comment: {}", communicationEntity);
return convertToCommunicationResponseBean(communicationEntity); return convertToCommunicationResponseBean(communicationEntity);
} }
public String deleteComment(Long amendmentId, Long commentId) { public String deleteComment(Long amendmentId, Long commentId) {
CommunicationEntity data = communicationRepository.findById(commentId) CommunicationEntity data = communicationRepository.findByIdAndIsDeletedFalse(commentId)
.orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND))); .orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)));
//cloned for old commentData
CommunicationEntity oldComment = Utils.getClonedEntityForData(data);
if (!data.getApplicationAmendmentRequest().getId().equals(amendmentId)) { if (!data.getApplicationAmendmentRequest().getId().equals(amendmentId)) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_AMENDMENT_FOR_COMMENT)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_AMENDMENT_FOR_COMMENT));
} }
data.setIsDeleted(true); data.setIsDeleted(true);
communicationRepository.save(data); data = communicationRepository.save(data);
/** This code is responsible for adding a version history log for the "soft deleting comment to amendment request" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldComment).newData(data).build());
return "Deleted Comment Successfully."; return "Deleted Comment Successfully.";
} }
@@ -70,6 +92,9 @@ public class CommunicationDao {
log.info("Updating communication comment..."); log.info("Updating communication comment...");
CommunicationEntity existingComment = communicationRepository.findById(commentId) CommunicationEntity existingComment = communicationRepository.findById(commentId)
.orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND))); .orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)));
//cloned for old data for communication
CommunicationEntity oldCommentData = Utils.getClonedEntityForData(existingComment);
if (!existingComment.getApplicationAmendmentRequest().getId().equals(amendmentId)) { if (!existingComment.getApplicationAmendmentRequest().getId().equals(amendmentId)) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG));
} }
@@ -78,6 +103,10 @@ public class CommunicationDao {
existingComment.setCommentedDate(LocalDateTime.now()); existingComment.setCommentedDate(LocalDateTime.now());
existingComment = communicationRepository.save(existingComment); existingComment = communicationRepository.save(existingComment);
log.info("Updated Comment: {}", existingComment); log.info("Updated Comment: {}", existingComment);
/** This code is responsible for adding a version history log for the "updating comment to amendment request" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCommentData).newData(existingComment).build());
return convertToCommunicationResponseBean(existingComment); return convertToCommunicationResponseBean(existingComment);
} }
@@ -92,6 +121,7 @@ public class CommunicationDao {
response.setTitle(entity.getCommunicationTitle()); response.setTitle(entity.getCommunicationTitle());
response.setSenderUserId(entity.getSenderUserId()); response.setSenderUserId(entity.getSenderUserId());
response.setReceiverUserId(entity.getReceiverUserId()); response.setReceiverUserId(entity.getReceiverUserId());
response.setId(entity.getId());
return response; return response;
} }

View File

@@ -1,11 +1,19 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import java.util.EnumSet;
import java.util.List; import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum;
import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.FaqRepository;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.errors.*; import net.gepafin.tendermanagement.web.rest.api.errors.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -15,8 +23,6 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.model.request.CompanyRequest; import net.gepafin.tendermanagement.model.request.CompanyRequest;
import net.gepafin.tendermanagement.model.response.CompanyResponse; import net.gepafin.tendermanagement.model.response.CompanyResponse;
import net.gepafin.tendermanagement.repositories.CompanyRepository;
import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
@@ -38,25 +44,47 @@ public class CompanyDao {
@Autowired @Autowired
private FaqRepository faqRepository; private FaqRepository faqRepository;
@Autowired
private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository;
@Autowired
private UserCompanyDelegationRepository userCompanyDelegationRepository;
@Autowired
private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) { public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) {
CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId()); CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId());
UserWithCompanyEntity userWithCompanyEntity = null; UserWithCompanyEntity userWithCompanyEntity = null;
if (existingCompany != null) { if (existingCompany != null) {
UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId()) UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId()).orElse(null);
.orElse(null);
if (existingRelation == null) { if (existingRelation == null) {
userWithCompanyEntity = createUserWithCompanyRelation(userEntity, existingCompany, companyRequest.getIsLegalRepresentant()); userWithCompanyEntity = createUserWithCompanyRelation(userEntity, existingCompany, companyRequest.getIsLegalRepresentant());
/** This code is responsible for adding a version history log for "adding user with company" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(userWithCompanyEntity).build());
} else { } else {
throw new CustomValidationException(Status.VALIDATION_ERROR, throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY));
Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY));
} }
return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity); return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity);
} else { } else {
validateCompany(userEntity, companyRequest); validateCompany(userEntity, companyRequest);
CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(userEntity, companyRequest); CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(userEntity, companyRequest);
companyRepository.save(companyEntity); CompanyEntity companyData = companyRepository.save(companyEntity);
/** This code is responsible for adding a version history log for "creating company" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(companyData).build());
userWithCompanyEntity = createUserWithCompanyRelation(userEntity, companyEntity, companyRequest.getIsLegalRepresentant()); userWithCompanyEntity = createUserWithCompanyRelation(userEntity, companyEntity, companyRequest.getIsLegalRepresentant());
return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity);
} }
} }
@@ -80,6 +108,7 @@ public class CompanyDao {
} }
private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity, Boolean isLegalRepresentant) { private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity, Boolean isLegalRepresentant) {
UserWithCompanyEntity userWithCompanyEntity = new UserWithCompanyEntity(); UserWithCompanyEntity userWithCompanyEntity = new UserWithCompanyEntity();
if (userEntity.getBeneficiary() != null) { if (userEntity.getBeneficiary() != null) {
userWithCompanyEntity.setBeneficiaryId(userEntity.getBeneficiary().getId()); userWithCompanyEntity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -88,7 +117,11 @@ public class CompanyDao {
userWithCompanyEntity.setCompanyId(companyEntity.getId()); userWithCompanyEntity.setCompanyId(companyEntity.getId());
userWithCompanyEntity.setUserId(userEntity.getId()); userWithCompanyEntity.setUserId(userEntity.getId());
userWithCompanyEntity.setIsLegalRepresentant(isLegalRepresentant); userWithCompanyEntity.setIsLegalRepresentant(isLegalRepresentant);
return userWithCompanyRepository.save(userWithCompanyEntity); UserWithCompanyEntity userWithCompany = userWithCompanyRepository.save(userWithCompanyEntity);
/** This code is responsible for adding a version history log for the "adding user with company" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(userWithCompany).build());
return userWithCompany;
} }
private CompanyEntity convertCompanyRequestToCompanyEntity(UserEntity userEntity, CompanyRequest request) { private CompanyEntity convertCompanyRequestToCompanyEntity(UserEntity userEntity, CompanyRequest request) {
@@ -139,32 +172,43 @@ public class CompanyDao {
} }
public CompanyResponse updateCompany(UserEntity userEntity, Long companyId, CompanyRequest companyRequest) { public CompanyResponse updateCompany(UserEntity userEntity, Long companyId, CompanyRequest companyRequest) {
CompanyEntity companyEntity = validateCompany(companyId); CompanyEntity companyEntity = validateCompany(companyId);
setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName, //cloned entity for old data
companyRequest.getCompanyName()); CompanyEntity oldCompanyData = Utils.getClonedEntityForData(companyEntity);
setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName, companyRequest.getCompanyName());
setIfUpdated(companyEntity::getVatNumber, companyEntity::setVatNumber, companyRequest.getVatNumber()); setIfUpdated(companyEntity::getVatNumber, companyEntity::setVatNumber, companyRequest.getVatNumber());
setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale, setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale, companyRequest.getCodiceFiscale());
companyRequest.getCodiceFiscale());
setIfUpdated(companyEntity::getAddress, companyEntity::setAddress, companyRequest.getAddress()); setIfUpdated(companyEntity::getAddress, companyEntity::setAddress, companyRequest.getAddress());
setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber, setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber, companyRequest.getPhoneNumber());
companyRequest.getPhoneNumber());
setIfUpdated(companyEntity::getCity, companyEntity::setCity, companyRequest.getCity()); setIfUpdated(companyEntity::getCity, companyEntity::setCity, companyRequest.getCity());
setIfUpdated(companyEntity::getProvince, companyEntity::setProvince, companyRequest.getProvince()); setIfUpdated(companyEntity::getProvince, companyEntity::setProvince, companyRequest.getProvince());
setIfUpdated(companyEntity::getCap, companyEntity::setCap, companyRequest.getCap()); setIfUpdated(companyEntity::getCap, companyEntity::setCap, companyRequest.getCap());
setIfUpdated(companyEntity::getCountry, companyEntity::setCountry, companyRequest.getCountry()); setIfUpdated(companyEntity::getCountry, companyEntity::setCountry, companyRequest.getCountry());
setIfUpdated(companyEntity::getPec, companyEntity::setPec, companyRequest.getPec()); setIfUpdated(companyEntity::getPec, companyEntity::setPec, companyRequest.getPec());
setIfUpdated(companyEntity::getEmail, companyEntity::setEmail, companyRequest.getEmail()); setIfUpdated(companyEntity::getEmail, companyEntity::setEmail, companyRequest.getEmail());
setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees, setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees, companyRequest.getNumberOfEmployees());
companyRequest.getNumberOfEmployees()); setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue, companyRequest.getAnnualRevenue());
setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue,
companyRequest.getAnnualRevenue());
setIfUpdated(companyEntity::getContactName, companyEntity::setContactName, companyRequest.getContactName()); setIfUpdated(companyEntity::getContactName, companyEntity::setContactName, companyRequest.getContactName());
setIfUpdated(companyEntity::getContactEmail, companyEntity::setContactEmail, companyRequest.getContactEmail()); setIfUpdated(companyEntity::getContactEmail, companyEntity::setContactEmail, companyRequest.getContactEmail());
companyRepository.save(companyEntity); companyRepository.save(companyEntity);
/** This code is responsible for adding a version history log for the "Update company" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData(companyEntity).build());
UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyId); UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyId);
Utils.setIfUpdated(userWithCompanyEntity::getIsLegalRepresentant, userWithCompanyEntity::setIsLegalRepresentant, //cloned entity for old data
companyRequest.getIsLegalRepresentant()); UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(userWithCompanyEntity);
userWithCompanyRepository.save(userWithCompanyEntity);
Utils.setIfUpdated(userWithCompanyEntity::getIsLegalRepresentant, userWithCompanyEntity::setIsLegalRepresentant, companyRequest.getIsLegalRepresentant());
userWithCompanyEntity = userWithCompanyRepository.save(userWithCompanyEntity);
/** This code is responsible for adding a version history log for the "Update company" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldUserWithCompanyData).newData(userWithCompanyEntity).build());
return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity);
} }
@@ -179,8 +223,20 @@ public class CompanyDao {
} }
public void deleteCompany(UserEntity userEntity, Long companyId) { public void deleteCompany(UserEntity userEntity, Long companyId) {
CompanyEntity companyEntity = validateCompany(companyId); CompanyEntity companyEntity = validateCompany(companyId);
/** This code is responsible for adding a version history log for the "delete company" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(companyEntity).newData(null).build());
companyRepository.delete(companyEntity); companyRepository.delete(companyEntity);
UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyId);
/** This code is responsible for adding a version history log for the "delete user with company" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(userWithCompanyEntity).newData(null).build());
userWithCompanyRepository.deleteByCompanyIdAndIsDeletedFalse(companyId); userWithCompanyRepository.deleteByCompanyIdAndIsDeletedFalse(companyId);
} }
@@ -205,25 +261,70 @@ public class CompanyDao {
} }
public void removeCompanyFromList(UserEntity userEntity, Long companyId) { public void removeCompanyFromList(UserEntity userEntity, Long companyId) {
CompanyEntity companyEntity = validateCompany(companyId); CompanyEntity companyEntity = validateCompany(companyId);
UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyEntity.getId()) UserWithCompanyEntity existingRelation=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId());
.orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY))); List<ApplicationEntity> userApplications = applicationRepository.findByUserWithCompanyIdAndUserIdAndIsDeletedFalse(existingRelation.getId(), userEntity.getId());
List<ApplicationEntity> userApplications = applicationRepository.findByCompanyIdAndUserIdAndIsDeletedFalse(companyEntity.getId(), userEntity.getId()); List<FaqEntity> faqs = faqRepository.findByUserWithCompanyIdAndIsDeletedFalse(existingRelation.getId());
List<FaqEntity> faqs = faqRepository.findByCompanyIdAndUserIdAndIsDeletedFalse(companyEntity.getId(), userEntity.getId()); List<BeneficiaryPreferredCallEntity> preferredCallEntities= beneficiaryPreferredCallRepository.findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(userEntity.getId(),existingRelation.getId());
for (ApplicationEntity application : userApplications) { UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository.findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(),existingRelation.getId(), UserCompanyDelegationStatusEnum.ACTIVE.getValue());
if(Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { List<String> applicationStatusAllowed = List.of(
ApplicationStatusTypeEnum.DRAFT.getValue(),
ApplicationStatusTypeEnum.AWAITING.getValue(),
ApplicationStatusTypeEnum.READY.getValue()
);
boolean notAllowedStatus = userApplications.stream()
.anyMatch(application -> !applicationStatusAllowed.contains(application.getStatus()));
if (notAllowedStatus) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT)); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT));
} }
if(Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) {
for(ApplicationEntity application:userApplications){
ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
application.setIsDeleted(Boolean.TRUE); application.setIsDeleted(Boolean.TRUE);
applicationRepository.save(application);
} /** This code is responsible for adding a version history log for the "Soft delete application" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldApplication).newData(application).build());
} }
applicationRepository.saveAll(userApplications);
for(FaqEntity faq:faqs){ for(FaqEntity faq:faqs){
FaqEntity oldFaq = Utils.getClonedEntityForData(faq);
faq.setIsDeleted(Boolean.TRUE); faq.setIsDeleted(Boolean.TRUE);
faqRepository.save(faq);
/** This code is responsible for adding a version history log for the "Soft delete Faq" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFaq).newData(faq).build());
} }
faqRepository.saveAll(faqs);
for(BeneficiaryPreferredCallEntity beneficiaryPreferredCall:preferredCallEntities){
BeneficiaryPreferredCallEntity oldPreferredCall = Utils.getClonedEntityForData(beneficiaryPreferredCall);
beneficiaryPreferredCall.setIsDeleted(Boolean.TRUE);
/** This code is responsible for adding a version history log for the "Soft Delete BeneficiaryPreferredCall" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldPreferredCall).newData(beneficiaryPreferredCall).build());
}
beneficiaryPreferredCallRepository.saveAll(preferredCallEntities);
if(userCompanyDelegationEntity!=null){
UserCompanyDelegationEntity oldUserWithCompanyDelegation = Utils.getClonedEntityForData(userCompanyDelegationEntity);
userCompanyDelegationEntity.setStatus( UserCompanyDelegationStatusEnum.INACTIVE.getValue());
userCompanyDelegationRepository.save(userCompanyDelegationEntity);
/** This code is responsible for adding a version history log for the "Update UserWithCompanyDelegation" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldUserWithCompanyDelegation).newData(userCompanyDelegationEntity).build());
}
UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(existingRelation);
existingRelation.setIsDeleted(Boolean.TRUE); existingRelation.setIsDeleted(Boolean.TRUE);
userWithCompanyRepository.save(existingRelation); userWithCompanyRepository.save(existingRelation);
/** This code is responsible for adding a version history log for the "soft deleting existing user relation" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldUserWithCompanyData).newData(existingRelation).build());
} }
} }

View File

@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum;
@@ -12,6 +13,7 @@ import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.CallRepository;
import net.gepafin.tendermanagement.repositories.CompanyRepository; import net.gepafin.tendermanagement.repositories.CompanyRepository;
import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.service.CompanyService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -32,6 +34,9 @@ public class DashboardDao {
@Autowired @Autowired
private CompanyRepository companyRepository; private CompanyRepository companyRepository;
@Autowired
private CompanyService companyService;
public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) { public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) {
SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean();
widgetResponseBean.setWidget1(createWidget1(requestedUserEntity)); widgetResponseBean.setWidget1(createWidget1(requestedUserEntity));
@@ -108,8 +113,9 @@ public class DashboardDao {
if (activeCalls != null) { if (activeCalls != null) {
beneficiaryWidgetResponseBean.setNumberOfCalls(activeCalls); beneficiaryWidgetResponseBean.setNumberOfCalls(activeCalls);
} }
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),company.getId());
Long activeApplication = applicationRepository.countSubmittedApplicationsByUserId(userEntity.getId(), Long activeApplication = applicationRepository.countSubmittedApplicationsByUserId(userEntity.getId(),
company.getId()); userWithCompanyEntity.getId());
if (activeApplication != null) { if (activeApplication != null) {
beneficiaryWidgetResponseBean.setNumberOfApplications(activeApplication); beneficiaryWidgetResponseBean.setNumberOfApplications(activeApplication);
} }

View File

@@ -5,10 +5,17 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.function.Function; import java.util.function.Function;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum;
import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.util.LoggingUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -18,10 +25,6 @@ import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum;
import net.gepafin.tendermanagement.model.request.CompanyDelegationRequest; import net.gepafin.tendermanagement.model.request.CompanyDelegationRequest;
import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse;
@@ -67,9 +70,21 @@ public class DelegationDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private UserWithCompanyRepository userWithCompanyRepository;
@Autowired
private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public ByteArrayOutputStream generateDocument(Map<String, String> placeholders, String templateName) { public ByteArrayOutputStream generateDocument(Map<String, String> placeholders, String templateName) {
try { try {
String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L); String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L);
InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName);
XWPFDocument doc = loadTemplate(templateStream); XWPFDocument doc = loadTemplate(templateStream);
replacePlaceholders(doc, placeholders); replacePlaceholders(doc, placeholders);
@@ -177,21 +192,23 @@ public class DelegationDao {
} }
} }
public CompanyDelegationResponse uploadCompanyDelegation(UserEntity userEntity, Long companyId, MultipartFile file) { public CompanyDelegationResponse uploadCompanyDelegation(UserEntity userEntity, Long companyId, MultipartFile file) {
companyDao.validateCompany(companyId); companyDao.validateCompany(companyId);
companyDao.getUserWithCompany(userEntity.getId(), companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId);
validateFileType(file); validateFileType(file);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
.findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId, .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue()); UserCompanyDelegationStatusEnum.ACTIVE.getValue());
if (userCompanyDelegationEntity != null) { if (userCompanyDelegationEntity != null) {
userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); deleteDelegationFromS3(userCompanyDelegationEntity);
userCompanyDelegationRepository.save(userCompanyDelegationEntity);
} }
UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3ForCompanyDelegation(file); UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3ForCompanyDelegation(file);
userCompanyDelegationEntity = new UserCompanyDelegationEntity(); userCompanyDelegationEntity = new UserCompanyDelegationEntity();
userCompanyDelegationEntity.setCompanyId(companyId); userCompanyDelegationEntity.setUserWithCompany(userWithCompanyEntity);
userCompanyDelegationEntity.setCompanyId(userWithCompanyEntity.getCompanyId());
userCompanyDelegationEntity.setUserId(userEntity.getId()); userCompanyDelegationEntity.setUserId(userEntity.getId());
if (userEntity.getBeneficiary() != null) { if (userEntity.getBeneficiary() != null) {
userCompanyDelegationEntity.setBeneficiaryId(userEntity.getBeneficiary().getId()); userCompanyDelegationEntity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -200,8 +217,14 @@ public class DelegationDao {
userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3Response.getFileName());
userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath());
userCompanyDelegationRepository.save(userCompanyDelegationEntity); userCompanyDelegationRepository.save(userCompanyDelegationEntity);
/** This code is responsible for adding a version history log for the "Insert or upload user company delegation" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null)
.newData(userCompanyDelegationEntity).build());
return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity);
} }
private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForCompanyDelegation(MultipartFile file) { private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForCompanyDelegation(MultipartFile file) {
try { try {
String s3Path = generateS3PathForDelegation(); String s3Path = generateS3PathForDelegation();
@@ -235,8 +258,9 @@ public class DelegationDao {
} }
public CompanyDelegationResponse getCompanyDelegation(UserEntity userEntity, Long companyId) { public CompanyDelegationResponse getCompanyDelegation(UserEntity userEntity, Long companyId) {
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
.findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId, .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue()); UserCompanyDelegationStatusEnum.ACTIVE.getValue());
companyDao.getUserWithCompany(userEntity.getId(), companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId);
if(userCompanyDelegationEntity == null) { if(userCompanyDelegationEntity == null) {
@@ -247,15 +271,30 @@ public class DelegationDao {
} }
public void deleteCompanyDelegation(UserEntity userEntity, Long companyId) { public void deleteCompanyDelegation(UserEntity userEntity, Long companyId) {
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
.findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId, .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue()); UserCompanyDelegationStatusEnum.ACTIVE.getValue());
companyDao.getUserWithCompany(userEntity.getId(), companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId);
if (userCompanyDelegationEntity == null) { if (userCompanyDelegationEntity == null) {
throw new ResourceNotFoundException(Status.NOT_FOUND, throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DELEGATION_NOT_FOUND));
Translator.toLocale(GepafinConstant.DELEGATION_NOT_FOUND));
} }
deleteDelegationFromS3(userCompanyDelegationEntity);
}
public void deleteDelegationFromS3(UserCompanyDelegationEntity userCompanyDelegationEntity) {
UserCompanyDelegationEntity oldUserCompanyDelegation = Utils.getClonedEntityForData(userCompanyDelegationEntity);
String oldS3Path = userCompanyDelegationEntity.getFilePath();
String newS3Path = s3ConfigBean.generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum.DELETED_USER_DELEGATION);
UploadFileOnAmazonS3Response response = amazonS3Service.moveFile(userCompanyDelegationEntity.getFileName(), oldS3Path, newS3Path);
userCompanyDelegationEntity.setFileName(response.getFileName());
userCompanyDelegationEntity.setFilePath(response.getFilePath());
userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue());
userCompanyDelegationRepository.save(userCompanyDelegationEntity); userCompanyDelegationRepository.save(userCompanyDelegationEntity);
/** This code is responsible for adding a version history log for the "Soft Deleting company delegation " operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldUserCompanyDelegation).newData(userCompanyDelegationEntity)
.build());
} }
} }

View File

@@ -1,10 +1,14 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import lombok.extern.slf4j.Slf4j;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -12,20 +16,24 @@ import org.springframework.web.multipart.MultipartFile;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.enums.DocumentTypeEnum;
import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean;
import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository;
import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService;
import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Value;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
@Component @Component
public class DocumentDao { public class DocumentDao {
@@ -48,10 +56,29 @@ public class DocumentDao {
@Autowired @Autowired
private ApplicationRepository applicationFormRepository; private ApplicationRepository applicationFormRepository;
@Autowired
ApplicationService applicationService;
@Autowired
ApplicationAmendmentRequestService applicationAmendmentRequestService;
@Autowired
ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository;
@Value("${aws.s3.bucket.name}")
private String bucketName;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
// @Value("${aws.s3.url.folder}") // @Value("${aws.s3.url.folder}")
// private String s3Folder; // private String s3Folder;
public List<DocumentResponseBean> uploadFiles(List<MultipartFile> files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { public List<DocumentResponseBean> uploadFiles(List<MultipartFile> files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) {
List<DocumentEntity> documentEntities = new ArrayList<>(); List<DocumentEntity> documentEntities = new ArrayList<>();
Long source = resolveSourceId(sourceId, sourceType); Long source = resolveSourceId(sourceId, sourceType);
for (MultipartFile file : files) { for (MultipartFile file : files) {
@@ -68,33 +95,77 @@ public class DocumentDao {
} }
} }
documentRepository.saveAll(documentEntities); documentRepository.saveAll(documentEntities);
/** This code is responsible for adding a version history log for the "Upload call or application document based on source type" operation. **/
documentEntities.forEach(entity -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build()));
return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList());
} }
public UserActionContextEnum getUserActionContextEnum(DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) {
UserActionContextEnum userActionContext = null;
if (fileType.equals(DocumentTypeEnum.DOCUMENT) && sourceType.equals(DocumentSourceTypeEnum.CALL)) {
userActionContext = UserActionContextEnum.UPLOAD_CALL_DOCUMENT;
} else if (fileType.equals(DocumentTypeEnum.IMAGES) && sourceType.equals(DocumentSourceTypeEnum.CALL)) {
userActionContext = UserActionContextEnum.UPLOAD_CALL_IMAGES;
} else if (fileType.equals(DocumentTypeEnum.DOCUMENT) && sourceType.equals(DocumentSourceTypeEnum.APPLICATION)) {
userActionContext = UserActionContextEnum.UPLOAD_APPLICATION_DOCUMENT;
} else if (fileType.equals(DocumentTypeEnum.IMAGES) && sourceType.equals(DocumentSourceTypeEnum.APPLICATION)) {
userActionContext = UserActionContextEnum.UPLOAD_APPLICATION_IMAGES;
}
return userActionContext;
}
public UserActionContextEnum getUserActionContextForUpdatingDocOrImage(DocumentTypeEnum documentTypeEnum) {
UserActionContextEnum userActionContext;
if (DocumentTypeEnum.DOCUMENT.equals(documentTypeEnum)) {
userActionContext = UserActionContextEnum.UPDATE_DOCUMENT;
} else{
userActionContext = UserActionContextEnum.UPDATE_IMAGES;
}
return userActionContext;
}
private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long sourceId) { private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long sourceId) {
Long applicationId = 0L; Long applicationId = 0L;
Long amendmentId = 0L;
Long callId = sourceId; Long callId = sourceId;
if (type == DocumentSourceTypeEnum.APPLICATION) { if (type == DocumentSourceTypeEnum.APPLICATION) {
applicationId = sourceId; applicationId = sourceId;
callId = applicationFormRepository.findCallIdById(applicationId); callId = applicationFormRepository.findCallIdById(applicationId);
} else if (type == DocumentSourceTypeEnum.AMENDMENT) {
amendmentId = sourceId;
ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId();
} }
try { try {
String s3Path = generateS3Path(type, callId, applicationId); String s3Path = generateS3Path(type, callId, applicationId, amendmentId);
log.info("Generated S3 path {}", s3Path); log.info("Generated S3 path {}", s3Path);
return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file);
} catch (Exception e) { } catch (Exception e) {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3));
} }
} }
public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId) {
public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId) {
try { try {
return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId); return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG));
} }
} }
private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) {
if (sourceType == DocumentSourceTypeEnum.CALL) { if (sourceType == DocumentSourceTypeEnum.CALL) {
CallEntity callEntity = callService.validateCall(sourceId); CallEntity callEntity = callService.validateCall(sourceId);
// callDao.validateUpdate(callEntity); // callDao.validateUpdate(callEntity);
@@ -111,12 +182,30 @@ public class DocumentDao {
public void deleteFile(Long documentId) { public void deleteFile(Long documentId) {
DocumentEntity documentEntity = documentRepository.findById(documentId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, DocumentEntity documentEntity = documentRepository.findById(documentId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)));
// String fileName= Utils.extractFileName(documentEntity.getFilePath()); if(Boolean.TRUE.equals(documentEntity.getIsDeleted())){
// deleteFileOnAmazonS3(fileName); return;
documentEntity.setIsDeleted(true); }
documentRepository.save(documentEntity); Long callId = null;
Long applicationId = null;
Long amendmentId = null;
if (DocumentSourceTypeEnum.CALL.getValue().equalsIgnoreCase(documentEntity.getSource())) {
callId = documentEntity.getSourceId();
} else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(documentEntity.getSource())) {
applicationId = documentEntity.getSourceId();
ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId);
callId = applicationEntity.getCall().getId();
}
else if(DocumentSourceTypeEnum.AMENDMENT.getValue().equalsIgnoreCase(documentEntity.getSource())){
amendmentId = documentEntity.getSourceId();
ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId();
} }
deleteFileFromS3(documentEntity, callId, applicationId,amendmentId);
}
public DocumentEntity validateDocument(Long id) { public DocumentEntity validateDocument(Long id) {
return documentRepository.findByIdAndNotDeleted(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, return documentRepository.findByIdAndNotDeleted(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
@@ -124,7 +213,11 @@ public class DocumentDao {
} }
public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) {
DocumentEntity documentEntity = validateDocument(documentId); DocumentEntity documentEntity = validateDocument(documentId);
//cloned entity for old data
DocumentEntity oldDocumentData = Utils.getClonedEntityForData(documentEntity);
String type = documentEntity.getSource(); String type = documentEntity.getSource();
UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId()); UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId());
if (uploadFileOnAmazonS3Response != null) { if (uploadFileOnAmazonS3Response != null) {
@@ -134,22 +227,35 @@ public class DocumentDao {
documentEntity.setSource(documentEntity.getSource()); documentEntity.setSource(documentEntity.getSource());
documentEntity.setSourceId(documentEntity.getSourceId()); documentEntity.setSourceId(documentEntity.getSourceId());
documentRepository.save(documentEntity); documentRepository.save(documentEntity);
/** This code is responsible for adding a version history log for the "updating doc or image" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldDocumentData).newData(documentEntity).build());
} }
return callDao.convertToDocumentResponseBean(documentEntity); return callDao.convertToDocumentResponseBean(documentEntity);
} }
private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) { private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) {
try { try {
Long callId; Long callId=null;
Long applicationId; Long applicationId=null;
Long amendmentId=null;
if (type.equals(DocumentSourceTypeEnum.APPLICATION)) { if (type.equals(DocumentSourceTypeEnum.APPLICATION)) {
callId = applicationFormRepository.findCallIdById(id); callId = applicationFormRepository.findCallIdById(id);
applicationId = id; applicationId = id;
}else{ }
else if(type.equals(DocumentSourceTypeEnum.AMENDMENT)){
amendmentId = id;
ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId();
}
else {
callId = id; callId = id;
applicationId = 0L; applicationId = 0L;
} }
String s3Path = generateS3Path(type, callId, applicationId); String s3Path = generateS3Path(type, callId, applicationId,amendmentId);
log.info("Generated S3 path {}", s3Path); log.info("Generated S3 path {}", s3Path);
return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file);
} catch (Exception e) { } catch (Exception e) {
@@ -160,4 +266,26 @@ public class DocumentDao {
DocumentEntity documentEntity = validateDocument(documentId); DocumentEntity documentEntity = validateDocument(documentId);
return callDao.convertToDocumentResponseBean(documentEntity); return callDao.convertToDocumentResponseBean(documentEntity);
} }
public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId) {
try {
DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity);
String oldS3Path = documentEntity.getFilePath();
String newS3Path = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId);
UploadFileOnAmazonS3Response response = amazonS3Service.moveFile(documentEntity.getFileName(), oldS3Path, newS3Path);
documentEntity.setFileName(response.getFileName());
documentEntity.setFilePath(response.getFilePath());
documentEntity.setIsDeleted(true);
documentRepository.save(documentEntity);
/** This code is responsible for adding a version history log for the "Soft delete document" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldDocumentEntity).newData(documentEntity).build());
log.info("File for document ID {} successfully moved to deleted folder.", documentEntity.getId());
} catch (Exception e) {
log.error("Error moving file for document ID {} to deleted folder: {}", documentEntity.getId(), e.getMessage());
throw new CustomValidationException(Status.VALIDATION_ERROR, "Error occurred while moving file to deleted folder.");
}
}
} }

View File

@@ -1,12 +1,16 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.EmailLogEntity; import net.gepafin.tendermanagement.entities.EmailLogEntity;
import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum; import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum;
import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum; import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum;
import net.gepafin.tendermanagement.enums.RecipientTypeEnum; import net.gepafin.tendermanagement.enums.RecipientTypeEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.EmailLogRequest; import net.gepafin.tendermanagement.model.request.EmailLogRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.EmailLogRepository; import net.gepafin.tendermanagement.repositories.EmailLogRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -20,6 +24,7 @@ public class EmailLogDao {
public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest) { public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest) {
EmailLogEntity emailLogEntity = new EmailLogEntity(); EmailLogEntity emailLogEntity = new EmailLogEntity();
emailLogEntity.setEmailType(emailLogRequest.getEmailType().getValue()); emailLogEntity.setEmailType(emailLogRequest.getEmailType().getValue());
emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue()); emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue());
@@ -38,6 +43,7 @@ public class EmailLogDao {
emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId()); emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId());
emailLogEntity.setCallId(emailLogRequest.getCallId()); emailLogEntity.setCallId(emailLogRequest.getCallId());
emailLogEntity = saveEmailLogEntity(emailLogEntity); emailLogEntity = saveEmailLogEntity(emailLogEntity);
return emailLogEntity; return emailLogEntity;
} }
public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){ public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){

View File

@@ -79,7 +79,7 @@ public class EmailNotificationDao {
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, hubEntity, null); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, hubEntity, null);
Map<String, String> subjectPlaceholders = new HashMap<>(); Map<String, String> subjectPlaceholders = new HashMap<>();
CompanyEntity company = companyService.validateCompany(applicationEntity.getCompany().getId()); CompanyEntity company = companyService.validateCompany(applicationEntity.getCompanyId());
subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName());
subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); subjectPlaceholders.put("{{company_name}}", company.getCompanyName());
// bodyPlaceholders.put("{{legal_mail}}", legalMail); // bodyPlaceholders.put("{{legal_mail}}", legalMail);
@@ -91,7 +91,7 @@ public class EmailNotificationDao {
private void sendEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List<String> additionalRecipients,Long amendmentId,SystemEmailTemplateResponse systemEmailTemplateResponse,String subject,String body) { private void sendEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List<String> additionalRecipients,Long amendmentId,SystemEmailTemplateResponse systemEmailTemplateResponse,String subject,String body) {
Optional<ApplicationEvaluationEntity> applicationEvaluationEntity = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationEntity.getId()); Optional<ApplicationEvaluationEntity> applicationEvaluationEntity = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationEntity.getId());
CompanyEntity company = companyService.validateCompany(applicationEntity.getCompany().getId()); CompanyEntity company = companyService.validateCompany(applicationEntity.getCompanyId());
String companyEmail = company.getEmail(); String companyEmail = company.getEmail();
String contactEmail = company.getContactEmail(); String contactEmail = company.getContactEmail();
@@ -258,6 +258,7 @@ public class EmailNotificationDao {
EmailConfig emailConfig = retrieveEmailConfig(hubId); EmailConfig emailConfig = retrieveEmailConfig(hubId);
EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType());
emailService.sendEmail(subject, body, recipientEmails, emailConfig,emailLogRequest); emailService.sendEmail(subject, body, recipientEmails, emailConfig,emailLogRequest);
// emailService.sendEmail(subject, body, recipientEmails, emailConfig);
} }
public EmailConfig retrieveEmailConfig(Long hubId) { public EmailConfig retrieveEmailConfig(Long hubId) {

View File

@@ -1,17 +1,22 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity;
import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity;
import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean;
import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository;
import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository;
import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.service.LookUpDataService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -35,64 +40,101 @@ public class EvaluationCriteriaDao {
@Autowired @Autowired
private CriteriaFormFieldRepository criteriaFormFieldRepository; private CriteriaFormFieldRepository criteriaFormFieldRepository;
public EvaluationCriteriaResponseBean createEvaluationCriteria( @Autowired
EvaluationCriteriaRequest evaluationCriteriaRequest) { private LoggingUtil loggingUtil;
EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(
evaluationCriteriaRequest); @Autowired
private HttpServletRequest request;
public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) {
EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.INSERT, null);
return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
} }
private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity( private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest,
EvaluationCriteriaRequest evaluationCriteriaRequest) { VersionActionTypeEnum actionType, EvaluationCriteriaEntity evaluationCriteriaEntity) {
EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity();
EvaluationCriteriaEntity entity;
if (evaluationCriteriaEntity != null && evaluationCriteriaEntity.getId() != null) {
entity = evaluationCriteriaEntity;
} else {
entity = new EvaluationCriteriaEntity();
}
//cloned for old data
EvaluationCriteriaEntity oldEvaluationCriteriaData = Utils.getClonedEntityForData(entity);
CallEntity callEntity = callService.validateCall(evaluationCriteriaRequest.getCallId()); CallEntity callEntity = callService.validateCall(evaluationCriteriaRequest.getCallId());
LookUpDataEntity looDataEntity = lookUpDataService LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(evaluationCriteriaRequest, LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA);
.validateLookUpData(evaluationCriteriaRequest.getLookUpDataId());
entity.setCall(callEntity); entity.setCall(callEntity);
entity.setLookupData(looDataEntity); entity.setLookupData(lookupDataEntity);
entity.setScore(0L); entity.setScore(0L);
if (evaluationCriteriaRequest.getScore() != null) { if (evaluationCriteriaRequest.getScore() != null) {
entity.setScore(evaluationCriteriaRequest.getScore()); entity.setScore(evaluationCriteriaRequest.getScore());
} }
entity = evaluationCriteriaRepository.save(entity); entity = evaluationCriteriaRepository.save(entity);
/** This code is responsible for adding a version history log for the "updating or creating evaluation criteria" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldEvaluationCriteriaData).newData(entity).build());
return entity; return entity;
} }
public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) { public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) {
return evaluationCriteriaRepository.findById(id)
.map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean) return evaluationCriteriaRepository.findById(id).map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
} }
public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) {
return evaluationCriteriaRepository.findById(id) return evaluationCriteriaRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
} }
public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) {
EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request); entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.UPDATE, entity);
return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity); return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
} }
public void deleteEvaluationCriteria(Long id) { public void deleteEvaluationCriteria(Long id) {
evaluationCriteriaRepository.deleteById(id); // evaluationCriteriaRepository.deleteById(id); // Not needed if setting isDeleted TRUE in the next line after fetching evaluation criteria
EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id);
// Clone the evaluation criteria entity for old data
EvaluationCriteriaEntity oldEvaluationCriteriaData = Utils.getClonedEntityForData(evaluationCriteriaEntity);
List<CriteriaFormFieldEntity> oldList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream()
.map(Utils::getClonedEntityForData).toList();
evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE);
evaluationCriteriaRepository.save(evaluationCriteriaEntity); evaluationCriteriaEntity = evaluationCriteriaRepository.save(evaluationCriteriaEntity);
List<CriteriaFormFieldEntity> list = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId())
.stream() /** This code is responsible for adding a version history log for the "updating evaluation criteria" operation. **/
.peek(data -> data.setIsDeleted(Boolean.TRUE)) loggingUtil.addVersionHistory(
.toList();; VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldEvaluationCriteriaData).newData(evaluationCriteriaEntity)
criteriaFormFieldRepository.saveAll(list); .build());
List<CriteriaFormFieldEntity> updatedList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream()
.peek(data -> data.setIsDeleted(Boolean.TRUE)).toList();
List<CriteriaFormFieldEntity> softDeletingSavedList = criteriaFormFieldRepository.saveAll(updatedList);
softDeletingSavedList.forEach(data -> {
CriteriaFormFieldEntity oldFieldData = oldList.stream().filter(old -> old.getId().equals(data.getId())).findFirst().orElse(null);
/** This code is responsible for adding a version history log for the "Soft deleting criteria form field" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFieldData).newData(data).build());
});
} }
private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(EvaluationCriteriaEntity entity) {
EvaluationCriteriaEntity entity) {
EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean(); EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean();
response.setId(entity.getId()); response.setId(entity.getId());
response.setScore(entity.getScore()); response.setScore(entity.getScore());

View File

@@ -1,20 +1,26 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.FaqEntity;
import net.gepafin.tendermanagement.entities.LookUpDataEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.request.FaqReq;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.model.response.FaqResponseBean;
import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.repositories.FaqRepository;
import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.service.LookUpDataService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.ResourceNotFoundException;
@@ -26,6 +32,7 @@ import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional;
@Component @Component
public class FaqDao { public class FaqDao {
@@ -45,19 +52,38 @@ public class FaqDao {
@Autowired @Autowired
private CompanyService companyService; private CompanyService companyService;
@Autowired
private UserWithCompanyRepository userWithCompanyRepository;
@Autowired
HttpServletRequest request;
@Autowired
LoggingUtil loggingUtil;
public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) { public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) {
CallEntity callEntity = callService.validateCall(callId); CallEntity callEntity = callService.validateCall(callId);
FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataTypeEnum.FAQ);
LookUpDataEntity.LookUpDataTypeEnum.FAQ); FaqEntity oldFaqEntity = Utils.getClonedEntityForData(entity);
if (validator.checkIsBeneficiary() && companyId == null) { if (validator.checkIsBeneficiary() && companyId == null) {
throw new CustomValidationException(Status.VALIDATION_ERROR, throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY));
Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY));
} }
UserWithCompanyEntity userWithCompanyEntity=null;
if(companyId!=null) { if(companyId!=null) {
companyService.validateCompany(companyId); userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
entity.setCompanyId(companyId); companyService.validateCompany(userWithCompanyEntity.getCompanyId());
entity.setCompanyId(userWithCompanyEntity.getCompanyId());
} }
entity.setUserWithCompany(userWithCompanyEntity);
faqRepository.save(entity); faqRepository.save(entity);
if (entity.getCompanyId() != null) {
/** This code is responsible for adding a version history log for the "Create FAQ" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFaqEntity).newData(entity).build());
}
return convertToFaqResponseBean(entity); return convertToFaqResponseBean(entity);
} }
@@ -68,14 +94,20 @@ public class FaqDao {
public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, UserEntity userEntity) { public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, UserEntity userEntity) {
FaqEntity entity = validateFaq(id); FaqEntity entity = validateFaq(id);
faqRequest.setId(entity.getId()); faqRequest.setId(entity.getId());
createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataTypeEnum.FAQ);
return convertToFaqResponseBean(entity); return convertToFaqResponseBean(entity);
} }
public void deleteFaq(Long id) { public void deleteFaq(Long id) {
FaqEntity faqEntity = validateFaq(id); FaqEntity faqEntity = validateFaq(id);
FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
faqEntity.setIsDeleted(Boolean.TRUE); faqEntity.setIsDeleted(Boolean.TRUE);
faqRepository.save(faqEntity); faqRepository.save(faqEntity);
/** This code is responsible for adding a version history log for the "soft delete faq" operation **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFaqEntity).newData(faqEntity).build());
} }
public FaqEntity validateFaq(Long id) { public FaqEntity validateFaq(Long id) {
@@ -89,14 +121,16 @@ public class FaqDao {
.toList(); .toList();
} }
public FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity, LookUpDataTypeEnum type) {
public FaqEntity createOrUpdateFaqEntity(FaqReq faqReq, CallEntity callEntity, UserEntity userEntity,
LookUpDataTypeEnum type) {
FaqEntity faqEntity = null; FaqEntity faqEntity = null;
FaqEntity oldFaqEntity = null;
VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
if (isExistingFaq(faqReq)) { if (isExistingFaq(faqReq)) {
faqEntity = faqRepository.findByIdAndCallIdAndIsDeletedFalse(faqReq.getId(), callEntity.getId()) faqEntity = faqRepository.findByIdAndCallIdAndIsDeletedFalse(faqReq.getId(), callEntity.getId())
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND)));
Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND))); oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
actionType = VersionActionTypeEnum.UPDATE;
} else { } else {
if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) { if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) {
lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type);
@@ -106,16 +140,20 @@ public class FaqDao {
faqEntity.setUser(userEntity); faqEntity.setUser(userEntity);
faqEntity.setIsVisible(false); faqEntity.setIsVisible(false);
faqEntity.setIsDeleted(false); faqEntity.setIsDeleted(false);
actionType = VersionActionTypeEnum.INSERT;
} }
if (faqReq.getResponse() != null && (faqEntity.getResponse() == null if (faqReq.getResponse() != null && (faqEntity.getResponse() == null || Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) {
|| Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) {
faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
} }
setIfUpdated(faqEntity::getTitle, faqEntity::setTitle, faqReq.getTitle()); setIfUpdated(faqEntity::getTitle, faqEntity::setTitle, faqReq.getTitle());
setIfUpdated(faqEntity::getValue, faqEntity::setValue, faqReq.getValue()); setIfUpdated(faqEntity::getValue, faqEntity::setValue, faqReq.getValue());
setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse()); setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse());
setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible()); setIfUpdated(faqEntity::getIsVisible, faqEntity::setIsVisible, faqReq.getIsVisible());
return faqRepository.save(faqEntity); faqEntity = faqRepository.save(faqEntity);
/** This code is responsible for adding a version history log for the "create or update faq" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldFaqEntity).newData(faqEntity).build());
return faqEntity;
} }
private boolean isExistingFaq(FaqReq faqReq) { private boolean isExistingFaq(FaqReq faqReq) {

View File

@@ -6,9 +6,11 @@ import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.FlowDataEntity; import net.gepafin.tendermanagement.entities.FlowDataEntity;
import net.gepafin.tendermanagement.entities.FlowEdgesEntity; import net.gepafin.tendermanagement.entities.FlowEdgesEntity;
import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; import net.gepafin.tendermanagement.model.request.FlowDataRequestBean;
import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean;
import net.gepafin.tendermanagement.model.request.FlowRequestBean; import net.gepafin.tendermanagement.model.request.FlowRequestBean;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.FlowDataResponseBean; import net.gepafin.tendermanagement.model.response.FlowDataResponseBean;
import net.gepafin.tendermanagement.model.response.FlowEdgesResponseBean; import net.gepafin.tendermanagement.model.response.FlowEdgesResponseBean;
import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean;
@@ -19,11 +21,17 @@ import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.service.FormService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.FieldValidator;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.itextpdf.text.pdf.PdfStructTreeController.returnType;
import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -47,7 +55,10 @@ public class FlowDao {
private FormService formService; private FormService formService;
@Autowired @Autowired
private CallDao callDao; private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) { public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) {
validateFlowRequestBean(flowRequestBean); validateFlowRequestBean(flowRequestBean);
@@ -76,11 +87,43 @@ public class FlowDao {
List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(call.getId()); List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(call.getId());
List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId()); List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId());
if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) { if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) {
if (call.getInitialForm() != null || call.getInitialForm() != null) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(call);
call.setInitialForm(null); call.setInitialForm(null);
call.setFinalForm(null); call.setFinalForm(null);
call = callRepository.save(call); call = callRepository.save(call);
/**
* This code is responsible for adding a version history log for the "update
* call for flow" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(call).build());
}
flowDataRepository.deleteAll(flowDataEntities); flowDataRepository.deleteAll(flowDataEntities);
flowEdgesRepository.deleteAll(flowEdgesEntities); flowEdgesRepository.deleteAll(flowEdgesEntities);
flowDataEntities.forEach(data->{
/**
* This code is responsible for adding a version history log for the "update
* call for flow" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.DELETE).oldData(data).newData(null).build());
});
flowEdgesEntities.forEach(data->{
/**
* This code is responsible for adding a version history log for the "update
* call for flow" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.DELETE).oldData(data).newData(null).build());
});
} }
} }
@@ -111,10 +154,19 @@ public class FlowDao {
} }
private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, CallEntity call) { private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, CallEntity call) {
CallEntity oldCallEntity = Utils.getClonedEntityForData(call);
call.setInitialForm(flowRequestBean.getInitialForm()); call.setInitialForm(flowRequestBean.getInitialForm());
call.setFinalForm(flowRequestBean.getFinalForm()); call.setFinalForm(flowRequestBean.getFinalForm());
call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
call = callRepository.save(call); call = callRepository.save(call);
/**
* This code is responsible for adding a version history log for the "update
* call for flow" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(call).build());
return call; return call;
} }
@@ -123,7 +175,16 @@ public class FlowDao {
List<FlowDataEntity> flowDataEntities = flowRequestBean.getFlowData().stream() List<FlowDataEntity> flowDataEntities = flowRequestBean.getFlowData().stream()
.map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call)) .map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call))
.collect(Collectors.toList()); .collect(Collectors.toList());
return flowDataRepository.saveAll(flowDataEntities); flowDataEntities = flowDataRepository.saveAll(flowDataEntities);
flowDataEntities.forEach(data->{
/**
* This code is responsible for adding a version history log for the "delete flow data" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(data).build());
});
return flowDataEntities;
} }
return null; return null;
} }
@@ -145,7 +206,16 @@ public class FlowDao {
List<FlowEdgesEntity> flowEdgesEntities = flowRequestBean.getFlowEdges().stream() List<FlowEdgesEntity> flowEdgesEntities = flowRequestBean.getFlowEdges().stream()
.map(flowEdgesRequestBean -> createFlowEdgesEntity(flowEdgesRequestBean, call)) .map(flowEdgesRequestBean -> createFlowEdgesEntity(flowEdgesRequestBean, call))
.collect(Collectors.toList()); .collect(Collectors.toList());
return flowEdgesRepository.saveAll(flowEdgesEntities); flowEdgesEntities = flowEdgesRepository.saveAll(flowEdgesEntities);
flowEdgesEntities.forEach(data->{
/**
* This code is responsible for adding a version history log for the "update
* call for flow" operation.
**/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request)
.actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(data).build());
});
return flowEdgesEntities;
} }
public FlowEdgesEntity createFlowEdgesEntity(FlowEdgesRequestBean flowEdgesRequestBean,CallEntity call) { public FlowEdgesEntity createFlowEdgesEntity(FlowEdgesRequestBean flowEdgesRequestBean,CallEntity call) {

View File

@@ -3,19 +3,15 @@ package net.gepafin.tendermanagement.dao;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.CompanyService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.ApplicationFormEntity;
import net.gepafin.tendermanagement.entities.ApplicationFormFieldEntity;
import net.gepafin.tendermanagement.entities.FlowDataEntity;
import net.gepafin.tendermanagement.entities.FlowEdgesEntity;
import net.gepafin.tendermanagement.entities.FormEntity;
import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.enums.FormActionEnum;
import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse;
import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.service.FormService;
@@ -44,6 +40,8 @@ public class FlowFormDao {
private FormService formService; private FormService formService;
@Autowired @Autowired
private FormDao formDao; private FormDao formDao;
@Autowired
private CompanyService companyService;
@@ -290,6 +288,7 @@ public class FlowFormDao {
private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) { private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) {
NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse(); NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse();
Integer completedSteps=0; Integer completedSteps=0;
CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
FormEntity formEntity = formService.validateForm(calculatedFormId); FormEntity formEntity = formService.validateForm(calculatedFormId);
nextOrPreviousFormResponse.setFormId(calculatedFormId); nextOrPreviousFormResponse.setFormId(calculatedFormId);
nextOrPreviousFormResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(applicationEntity.getStatus())); nextOrPreviousFormResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(applicationEntity.getStatus()));
@@ -297,8 +296,8 @@ public class FlowFormDao {
applicationDao.processForm(formEntity, applicationEntity)); applicationDao.processForm(formEntity, applicationEntity));
nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId());
nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName());
nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompany().getId()); nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompanyId());
nextOrPreviousFormResponse.setCompanyName(applicationEntity.getCompany().getCompanyName()); nextOrPreviousFormResponse.setCompanyName(company.getCompanyName());
List<FlowEdgesEntity> flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); List<FlowEdgesEntity> flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
Long totalFormSteps = calculateTotalSteps(flowEdgesList); Long totalFormSteps = calculateTotalSteps(flowEdgesList);

View File

@@ -1,8 +1,10 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.ContentResponseBean;
import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean;
@@ -10,6 +12,7 @@ import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.EvaluationCriteriaService; import net.gepafin.tendermanagement.service.EvaluationCriteriaService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.FieldValidator;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -62,19 +65,31 @@ public class FormDao {
@Autowired @Autowired
private EvaluationCriteriaService evaluationCriteriaService; private EvaluationCriteriaService evaluationCriteriaService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public FormEntity saveFormEntity(FormEntity formEntity){ public FormEntity saveFormEntity(FormEntity formEntity){
formEntity=formRepository.save(formEntity); formEntity=formRepository.save(formEntity);
return formEntity; return formEntity;
} }
public FormEntity convertFormRequestToFormEntity(CallEntity callEntity, FormRequest formRequest) { public FormEntity convertFormRequestToFormEntity(CallEntity callEntity, FormRequest formRequest) {
FormEntity formEntity = new FormEntity(); FormEntity formEntity = new FormEntity();
formEntity.setCall(callEntity); formEntity.setCall(callEntity);
formEntity.setLabel(formRequest.getLabel()); formEntity.setLabel(formRequest.getLabel());
formEntity.setContent(setContentResponseBean(formRequest.getContent())); formEntity.setContent(setContentResponseBean(formRequest.getContent()));
formEntity = saveFormEntity(formEntity); formEntity = saveFormEntity(formEntity);
/** This code is responsible for adding a version history log for the "Create form" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(formEntity).build());
return formEntity; return formEntity;
} }
public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity) { public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity) {
FormResponseBean formResponseBean=new FormResponseBean(); FormResponseBean formResponseBean=new FormResponseBean();
formResponseBean.setId(formEntity.getId()); formResponseBean.setId(formEntity.getId());
@@ -98,15 +113,32 @@ public class FormDao {
} }
public FormResponseBean createForm(CallEntity callEntity, FormRequest formRequest) { public FormResponseBean createForm(CallEntity callEntity, FormRequest formRequest) {
validateForm(formRequest); validateForm(formRequest);
//cloned entity for old call data.
CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(callEntity.getId()); List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(callEntity.getId());
List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(callEntity.getId()); List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(callEntity.getId());
if (Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities == null) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities == null)) { if (Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities == null) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities == null)) {
/** This code is responsible for adding a version history log for "delete all flow data" operation. **/
flowDataEntities.stream().forEach(data -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(data).newData(null).build()));
/** This code is responsible for adding a version history log for "delete all flow edges" operation. **/
flowEdgesEntities.stream().forEach(edge -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(edge).newData(null).build()));
flowDataRepository.deleteAll(flowDataEntities); flowDataRepository.deleteAll(flowDataEntities);
flowEdgesRepository.deleteAll(flowEdgesEntities); flowEdgesRepository.deleteAll(flowEdgesEntities);
callEntity.setInitialForm(null); callEntity.setInitialForm(null);
callEntity.setFinalForm(null); callEntity.setFinalForm(null);
callRepository.save(callEntity); callRepository.save(callEntity);
/** This code is responsible for adding a version history log for "update call" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallData).newData(callEntity).build());
} }
FormEntity formEntity = convertFormRequestToFormEntity(callEntity, formRequest); FormEntity formEntity = convertFormRequestToFormEntity(callEntity, formRequest);
validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent()); validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent());
@@ -134,9 +166,24 @@ public class FormDao {
.filter(criteriaId -> !existingEvaluationCriteriaIds.contains(criteriaId)) .filter(criteriaId -> !existingEvaluationCriteriaIds.contains(criteriaId))
.forEach(criteriaId -> createCriteriaFormField(callEntity, formEntity, content.getId(), criteriaId)); .forEach(criteriaId -> createCriteriaFormField(callEntity, formEntity, content.getId(), criteriaId));
// Prepare entities to be marked as deleted
List<CriteriaFormFieldEntity> toBeDeleted = existingCriteriaFields.stream() List<CriteriaFormFieldEntity> toBeDeleted = existingCriteriaFields.stream()
.filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId())) .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId()))
.peek(data->data.setIsDeleted(Boolean.TRUE)) .peek(data -> {
// Clone the entity before modification
CriteriaFormFieldEntity clonedData = Utils.getClonedEntityForData(data);
data.setIsDeleted(Boolean.TRUE);
/** This code is responsible for adding a version history log for the "soft deleting criteria from field" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder()
.request(request)
.actionType(VersionActionTypeEnum.SOFT_DELETE)
.oldData(clonedData)
.newData(data)
.build()
);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!toBeDeleted.isEmpty()) { if (!toBeDeleted.isEmpty()) {
@@ -146,6 +193,7 @@ public class FormDao {
} }
private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity, private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity,
String formFieldId,Long evaluationCriteriaId) { String formFieldId,Long evaluationCriteriaId) {
EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId);
@@ -161,6 +209,9 @@ public class FormDao {
criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId); criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId);
criteriaFormFieldRepository.save(criteriaFormField); criteriaFormFieldRepository.save(criteriaFormField);
/** This code is responsible for adding a version history log for the "creating criteria form field" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(criteriaFormField).build());
} }
public void validateForm(FormRequest formRequest){ public void validateForm(FormRequest formRequest){
@@ -169,9 +220,13 @@ public class FormDao {
} }
} }
public FormResponseBean updateForm(UserEntity user, Long formId, FormRequest formRequest, Boolean forceDeleteFlow) { public FormResponseBean updateForm(UserEntity user, Long formId, FormRequest formRequest, Boolean forceDeleteFlow) {
ContentRequestBean contentRequestBean2 = null; ContentRequestBean contentRequestBean2 = null;
String choosenField = null; String choosenField = null;
FormEntity formEntity = validateForm(formId); FormEntity formEntity = validateForm(formId);
//cloned for old form data
FormEntity oldFormData = Utils.getClonedEntityForData(formEntity);
validator.validateUserWithCall(user, formEntity.getCall().getId()); validator.validateUserWithCall(user, formEntity.getCall().getId());
// callDao.validateUpdate(formEntity.getCall()); // callDao.validateUpdate(formEntity.getCall());
List<ContentRequestBean> contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); List<ContentRequestBean> contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class);
@@ -198,27 +253,54 @@ public class FormDao {
Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
formEntity = saveFormEntity(formEntity); formEntity = saveFormEntity(formEntity);
/** This code is responsible for adding a version history log for the "update from" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFormData).newData(formEntity)
.build());
List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId()); List<FlowDataEntity> flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId());
List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId()); List<FlowEdgesEntity> flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId());
/** This code is responsible for adding a version history log for "delete all flow data" operation. **/
flowDataEntities.stream().forEach(data -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(data).newData(null).build()));
/** This code is responsible for adding a version history log for "delete all flow edges" operation. **/
flowEdgesEntities.stream().forEach(edge -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(edge).newData(null).build()));
flowDataRepository.deleteAll(flowDataEntities); flowDataRepository.deleteAll(flowDataEntities);
flowEdgesRepository.deleteAll(flowEdgesEntities); flowEdgesRepository.deleteAll(flowEdgesEntities);
CallEntity callEntity = formEntity.getCall(); CallEntity callEntity = formEntity.getCall();
//cloned for oldCall data
CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
callEntity.setInitialForm(null); callEntity.setInitialForm(null);
callEntity.setFinalForm(null); callEntity.setFinalForm(null);
callRepository.save(callEntity); callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "update call" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallData).newData(callEntity)
.build());
return convertFormEntityToFormResponseBean(formEntity); return convertFormEntityToFormResponseBean(formEntity);
} else { } else {
throw new CustomValidationException( throw new CustomValidationException(Status.BAD_REQUEST,
Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField));
Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField)
);
} }
} } else {
else {
Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
formEntity = saveFormEntity(formEntity); formEntity = saveFormEntity(formEntity);
/** This code is responsible for adding a version history log for the "update from" operation. **/
loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFormData).newData(formEntity)
.build());
return convertFormEntityToFormResponseBean(formEntity); return convertFormEntityToFormResponseBean(formEntity);
} }
} }
@@ -226,12 +308,15 @@ public class FormDao {
} }
} }
} }
} } else {
else {
Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
formEntity = saveFormEntity(formEntity); formEntity = saveFormEntity(formEntity);
/** This code is responsible for adding a version history log for the "Update form data" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFormData).newData(formEntity).build());
validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent()); validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent());
return convertFormEntityToFormResponseBean(formEntity); return convertFormEntityToFormResponseBean(formEntity);
} }
@@ -254,12 +339,28 @@ public class FormDao {
validator.validateUserWithCall(user, formEntity.getCall().getId()); validator.validateUserWithCall(user, formEntity.getCall().getId());
List<FlowDataEntity> flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId()); List<FlowDataEntity> flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId());
List<FlowEdgesEntity> flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId()); List<FlowEdgesEntity> flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId());
/** This code is responsible for adding a version history log for "delete all flow data" operation. **/
flowDataEntities.stream().forEach(data -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(data).newData(null).build()));
/** This code is responsible for adding a version history log for "delete all flow edges" operation. **/
flowEdgesEntities.stream().forEach(edge -> loggingUtil.addVersionHistory(
VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(edge).newData(null).build()));
flowDataRepository.deleteAll(flowDataEntities); flowDataRepository.deleteAll(flowDataEntities);
flowEdgesRepository.deleteAll(flowEdgesEntities); flowEdgesRepository.deleteAll(flowEdgesEntities);
CallEntity callEntity=formEntity.getCall(); CallEntity callEntity=formEntity.getCall();
//cloned for getting old call data
CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
callEntity.setFinalForm(null); callEntity.setFinalForm(null);
callEntity.setInitialForm(null); callEntity.setInitialForm(null);
callRepository.save(callEntity); callRepository.save(callEntity);
/** This code is responsible for adding a version history log for the "Create Call" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(callEntity).build());
formRepository.delete(formEntity); formRepository.delete(formEntity);
} }
public List<FormResponseBean> getFormsByCallId(CallEntity callEntity){ public List<FormResponseBean> getFormsByCallId(CallEntity callEntity){

View File

@@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.FormFieldEntity; import net.gepafin.tendermanagement.entities.FormFieldEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.FormFieldRequest; import net.gepafin.tendermanagement.model.request.FormFieldRequest;
import net.gepafin.tendermanagement.model.request.SettingRequestBean; import net.gepafin.tendermanagement.model.request.SettingRequestBean;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.FormFieldResponseBean; import net.gepafin.tendermanagement.model.response.FormFieldResponseBean;
import net.gepafin.tendermanagement.model.response.SettingResponseBean; import net.gepafin.tendermanagement.model.response.SettingResponseBean;
import net.gepafin.tendermanagement.repositories.FormFieldRepository; import net.gepafin.tendermanagement.repositories.FormFieldRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.ResourceNotFoundException;
@@ -16,6 +19,8 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -26,6 +31,12 @@ public class FormFieldDao {
@Autowired @Autowired
private FormFieldRepository formFieldRepository; private FormFieldRepository formFieldRepository;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) { public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) {
FormFieldEntity formFieldEntity = new FormFieldEntity(); FormFieldEntity formFieldEntity = new FormFieldEntity();
formFieldEntity.setLabel(formFieldRequest.getLabel()); formFieldEntity.setLabel(formFieldRequest.getLabel());
@@ -34,7 +45,11 @@ public class FormFieldDao {
formFieldEntity.setSortOrder(formFieldRequest.getSortOrder()); formFieldEntity.setSortOrder(formFieldRequest.getSortOrder());
formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators()));
formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings())); formFieldEntity.setSettings(setSettingRequestBean(formFieldRequest.getSettings()));
formFieldEntity = saveFormFieldEntity(formFieldEntity); formFieldEntity = formFieldRepository.save(formFieldEntity);
/** This code is responsible for adding a version history log for the "Create FormField" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(formFieldEntity).build());
return formFieldEntity; return formFieldEntity;
} }
@@ -51,10 +66,10 @@ public class FormFieldDao {
return formFieldResponseBean; return formFieldResponseBean;
} }
public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) { // public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) {
formFieldEntity = formFieldRepository.save(formFieldEntity); // formFieldEntity = formFieldRepository.save(formFieldEntity);
return formFieldEntity; // return formFieldEntity;
} // }
public void validateFormField(FormFieldRequest formFieldRequest) { public void validateFormField(FormFieldRequest formFieldRequest) {
if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) { if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) {
@@ -71,6 +86,7 @@ public class FormFieldDao {
public FormFieldResponseBean updateFormField(Long formFieldId, FormFieldRequest formFieldRequest) { public FormFieldResponseBean updateFormField(Long formFieldId, FormFieldRequest formFieldRequest) {
FormFieldEntity formFieldEntity = validateFormField(formFieldId); FormFieldEntity formFieldEntity = validateFormField(formFieldId);
FormFieldEntity oldFormFieldEntity = Utils.getClonedEntityForData(formFieldEntity);
Utils.setIfUpdated(formFieldEntity::getName, formFieldEntity::setName, formFieldRequest.getName()); Utils.setIfUpdated(formFieldEntity::getName, formFieldEntity::setName, formFieldRequest.getName());
Utils.setIfUpdated(formFieldEntity::getLabel, formFieldEntity::setLabel, formFieldRequest.getLabel()); Utils.setIfUpdated(formFieldEntity::getLabel, formFieldEntity::setLabel, formFieldRequest.getLabel());
Utils.setIfUpdated(formFieldEntity::getDescription, formFieldEntity::setDescription, formFieldRequest.getDescription()); Utils.setIfUpdated(formFieldEntity::getDescription, formFieldEntity::setDescription, formFieldRequest.getDescription());
@@ -80,7 +96,13 @@ public class FormFieldDao {
Utils.setIfUpdated(formFieldEntity::getValidators, formFieldEntity::setValidators, Utils.setIfUpdated(formFieldEntity::getValidators, formFieldEntity::setValidators,
Utils.convertMapIntoJsonString(formFieldRequest.getValidators())); Utils.convertMapIntoJsonString(formFieldRequest.getValidators()));
formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); formFieldEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
formFieldEntity = saveFormFieldEntity(formFieldEntity);
formFieldEntity = formFieldRepository.save(formFieldEntity);
/** This code is responsible for adding a version history log for the "Update FormField" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldFormFieldEntity).newData(formFieldEntity).build());
return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity); return convertFormFieldEntityToFormFieldResponseBean(formFieldEntity);
} }
@@ -99,6 +121,11 @@ public class FormFieldDao {
public void deleteFormById(Long formFieldId) { public void deleteFormById(Long formFieldId) {
FormFieldEntity formEntity = validateFormField(formFieldId); FormFieldEntity formEntity = validateFormField(formFieldId);
formFieldRepository.delete(formEntity); formFieldRepository.delete(formEntity);
/** This code is responsible for adding a version history log for the "Delete FormField" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(formEntity).newData(null).build());
} }
public String setSettingRequestBean(List<SettingRequestBean> settingRequestBeans) { public String setSettingRequestBean(List<SettingRequestBean> settingRequestBeans) {

View File

@@ -1,12 +1,17 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.HubEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.request.HubReq;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.HubResponseBean; import net.gepafin.tendermanagement.model.response.HubResponseBean;
import net.gepafin.tendermanagement.model.util.NanoIdUtils; import net.gepafin.tendermanagement.model.util.NanoIdUtils;
import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.repositories.HubRepository;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -22,15 +27,26 @@ public class HubDao {
@Autowired @Autowired
private HubRepository hubRepository; private HubRepository hubRepository;
public HubResponseBean createHub(HubReq hubReq) { @Autowired
private LoggingUtil loggingUtil;
public HubResponseBean createHub(HttpServletRequest request,HubReq hubReq) {
HubEntity hubEntity = createOrUpdateHubEntity(new HubEntity(), hubReq); HubEntity hubEntity = createOrUpdateHubEntity(new HubEntity(), hubReq);
hubRepository.save(hubEntity); hubRepository.save(hubEntity);
/** This code is responsible for adding a version history log for the "Create Hub" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(hubEntity).build());
return convertToHubResponseBean(hubEntity); return convertToHubResponseBean(hubEntity);
} }
public HubResponseBean updateHub(Long hubId, HubReq hubReq) { public HubResponseBean updateHub(HttpServletRequest request,Long hubId, HubReq hubReq) {
HubEntity hubEntity = validateHub(hubId); HubEntity hubEntity = validateHub(hubId);
createOrUpdateHubEntity(hubEntity, hubReq); HubEntity oldHubEntity = Utils.getClonedEntityForData(hubEntity);
HubEntity newHubEntity = createOrUpdateHubEntity(hubEntity, hubReq);
/** This code is responsible for adding a version history log for the "Update Hub" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubEntity).newData(newHubEntity).build());
return convertToHubResponseBean(hubEntity); return convertToHubResponseBean(hubEntity);
} }
@@ -43,10 +59,13 @@ public class HubDao {
return hubs.stream().map(this::convertToHubResponseBean).toList(); return hubs.stream().map(this::convertToHubResponseBean).toList();
} }
public void deleteHub(Long hubId) { public void deleteHub(HttpServletRequest request,Long hubId) {
HubEntity hubEntity = validateHub(hubId); HubEntity hubEntity = validateHub(hubId);
/** This code is responsible for adding a version history log for the "Delete Hub" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(hubEntity).build());
hubRepository.deleteById(hubId); hubRepository.deleteById(hubId);
hubRepository.save(hubEntity);
} }
public HubEntity validateHub(Long hubId) { public HubEntity validateHub(Long hubId) {

View File

@@ -1,12 +1,17 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.LoginAttemptEntity; import net.gepafin.tendermanagement.entities.LoginAttemptEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean; import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean;
import net.gepafin.tendermanagement.repositories.LoginAttemptRepository; import net.gepafin.tendermanagement.repositories.LoginAttemptRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@@ -24,10 +29,23 @@ public class LoginAttemptDao {
@Autowired @Autowired
LoginAttemptRepository loginAttemptRepository; LoginAttemptRepository loginAttemptRepository;
public void createLoginAttempt(LoginAttemptEntity loginAttemptEntity) { @Autowired
loginAttemptEntity.setAttemptDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); private LoggingUtil loggingUtil;
loginAttemptRepository.save(loginAttemptEntity); @Autowired
private HttpServletRequest request;
public LoginAttemptEntity createLoginAttempt(LoginAttemptEntity loginAttemptEntity) {
VersionActionTypeEnum actionType;
loginAttemptEntity.setAttemptDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
loginAttemptEntity = loginAttemptRepository.save(loginAttemptEntity);
/** This code is responsible for adding a version history log for "Create Login Attempt" operation. **/
loggingUtil.addVersionHistoryWithoutToken(
VersionHistoryRequest.builder().actionType(VersionActionTypeEnum.INSERT).request(request).oldData(null).newData(loginAttemptEntity).build());
return loginAttemptEntity;
} }
public LoginAttemptPageableResponseBean<List<LoginAttemptEntity>> getLoginAttemptsList(UserEntity userEntity, Integer pageNo, Integer pageLimit) { public LoginAttemptPageableResponseBean<List<LoginAttemptEntity>> getLoginAttemptsList(UserEntity userEntity, Integer pageNo, Integer pageLimit) {

View File

@@ -1,11 +1,16 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity;
import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.LookUpDataReq;
import net.gepafin.tendermanagement.model.request.LookUpDataRequest; import net.gepafin.tendermanagement.model.request.LookUpDataRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean; import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean;
import net.gepafin.tendermanagement.repositories.LookUpDataRepository; import net.gepafin.tendermanagement.repositories.LookUpDataRepository;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -25,6 +30,12 @@ public class LookUpDataDao {
@Autowired @Autowired
private LookUpDataRepository lookUpDataRepository; private LookUpDataRepository lookUpDataRepository;
@Autowired
HttpServletRequest request;
@Autowired
LoggingUtil loggingUtil;
public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) { public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) {
LookUpDataEntity entity = convertLookUpDataReqToLookUpDataEntity(lookUpDataReq); LookUpDataEntity entity = convertLookUpDataReqToLookUpDataEntity(lookUpDataReq);
return convertLookUpDataEntityToResponseBean(entity); return convertLookUpDataEntityToResponseBean(entity);
@@ -37,6 +48,9 @@ public class LookUpDataDao {
entity.setValue(lookUpDataReq.getResponse()); entity.setValue(lookUpDataReq.getResponse());
validateLookUpDataEntity(entity); validateLookUpDataEntity(entity);
lookUpDataRepository.save(entity); lookUpDataRepository.save(entity);
/** This code is responsible for adding a version history log for the "Create LoopUpData" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(entity).build());
return entity; return entity;
} }
@@ -57,16 +71,27 @@ public class LookUpDataDao {
public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) { public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) {
LookUpDataEntity entity = validateLookUpData(id); LookUpDataEntity entity = validateLookUpData(id);
LookUpDataEntity oldLookUpData = Utils.getClonedEntityForData(entity);
setIfUpdated(entity::getTitle, entity::setTitle, lookUpDataReq.getTitle()); setIfUpdated(entity::getTitle, entity::setTitle, lookUpDataReq.getTitle());
setIfUpdated(entity::getValue, entity::setValue, lookUpDataReq.getValue()); setIfUpdated(entity::getValue, entity::setValue, lookUpDataReq.getValue());
setIfUpdated(entity::getResponse, entity::setResponse, lookUpDataReq.getResponse()); setIfUpdated(entity::getResponse, entity::setResponse, lookUpDataReq.getResponse());
lookUpDataRepository.save(entity); lookUpDataRepository.save(entity);
/** This code is responsible for adding a version history log for the "Update LookUpData" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldLookUpData).newData(entity).build());
return convertLookUpDataEntityToResponseBean(entity); return convertLookUpDataEntityToResponseBean(entity);
} }
public void deleteLookUpData(Long id) { public void deleteLookUpData(Long id) {
LookUpDataEntity entity = validateLookUpData(id); LookUpDataEntity oldLookUpData = validateLookUpData(id);
lookUpDataRepository.deleteById(entity.getId());
/** This code is responsible for adding a version history log for the "Delete LookUpData" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(oldLookUpData).build());
lookUpDataRepository.deleteById(id);
} }
private LookUpDataResponseBean convertLookUpDataEntityToResponseBean(LookUpDataEntity entity) { private LookUpDataResponseBean convertLookUpDataEntityToResponseBean(LookUpDataEntity entity) {
@@ -88,16 +113,20 @@ public class LookUpDataDao {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) {
LookUpDataEntity.LookUpDataTypeEnum type) {
if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0L)) {
LookUpDataEntity newEntity = new LookUpDataEntity(); LookUpDataEntity newEntity = new LookUpDataEntity();
newEntity.setTitle(req.getTitle()); newEntity.setTitle(req.getTitle());
newEntity.setValue(req.getValue()); newEntity.setValue(req.getValue());
newEntity.setResponse(req.getResponse()); newEntity.setResponse(req.getResponse());
newEntity.setType(type.getValue()); newEntity.setType(type.getValue());
validateLookUpDataEntity(newEntity); validateLookUpDataEntity(newEntity);
return lookUpDataRepository.save(newEntity); LookUpDataEntity lookUpDataEntity = lookUpDataRepository.save(newEntity);
/** This code is responsible for adding a version history log for the "create or update lookup data" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(lookUpDataEntity).build());
return lookUpDataEntity;
} }
return lookUpDataRepository.findById(req.getLookUpDataId()) return lookUpDataRepository.findById(req.getLookUpDataId())

View File

@@ -57,7 +57,7 @@ public class PdfDao {
try { try {
UserEntity userEntity = validator.validateUser(request); UserEntity userEntity = validator.validateUser(request);
ApplicationEntity applicationEntity = applicationDao.validateApplication(applicationId); ApplicationEntity applicationEntity = applicationDao.validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
CallEntity call=callService.validateCall(applicationEntity.getCall().getId()); CallEntity call=callService.validateCall(applicationEntity.getCall().getId());
// Create a byte stream to hold the PDF // Create a byte stream to hold the PDF

View File

@@ -3,6 +3,10 @@ package net.gepafin.tendermanagement.dao;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.util.LoggingUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -23,6 +27,11 @@ public class ProtocolDao {
@Value("${default.hub.uuid}") @Value("${default.hub.uuid}")
private String defaultHubUuid; private String defaultHubUuid;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public Long getProtocolNumber(HubEntity hubEntity) { public Long getProtocolNumber(HubEntity hubEntity) {
Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId()); Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId());
@@ -43,6 +52,10 @@ public class ProtocolDao {
protocolEntity.setApplicationId(applicationEntity.getId()); protocolEntity.setApplicationId(applicationEntity.getId());
protocolEntity.setHubId(hubId); protocolEntity.setHubId(hubId);
protocolRepository.save(protocolEntity); protocolRepository.save(protocolEntity);
/** This code is responsible for adding a version history log for "create protocol" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(protocolEntity).build());
return protocolEntity; return protocolEntity;
} }
} }

View File

@@ -13,25 +13,28 @@ public class S3PathConfig {
@Autowired @Autowired
S3ConfigRepository s3ConfigRepository; S3ConfigRepository s3ConfigRepository;
public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId) { public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) {
S3ConfigEntity config = getDocumentPath(type); S3ConfigEntity config = getDocumentPath(type);
return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId);
} }
public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId) { public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) {
S3ConfigEntity config = getDocumentPathForOther(type); S3ConfigEntity config = getDocumentPathForOther(type);
return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId);
}
private String buildS3Path(String pathTemplate, Long callId, Long applicationId) {
return pathTemplate.replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "").replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : "");
} }
public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) { public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) {
S3ConfigEntity config = getDocumentPathForOther(type); S3ConfigEntity config = getDocumentPathForOther(type);
return config.getParentFolder() + "/" + config.getPath(); return config.getParentFolder() + "/" + config.getPath();
} }
private String buildS3Path(String pathTemplate, Long callId, Long applicationId, Long amendmentId) {
return pathTemplate
.replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "")
.replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : "")
.replace("{amendment_id}", amendmentId != null && amendmentId != 0L ? "amendment_" + amendmentId : "");
}
private S3ConfigEntity getDocumentPath(DocumentSourceTypeEnum type) { private S3ConfigEntity getDocumentPath(DocumentSourceTypeEnum type) {
return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type));

View File

@@ -7,7 +7,10 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.response.CompanyResponse; import net.gepafin.tendermanagement.model.response.CompanyResponse;
import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean;
@@ -19,6 +22,7 @@ import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.HubService;
import net.gepafin.tendermanagement.service.RoleService; import net.gepafin.tendermanagement.service.RoleService;
import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.service.impl.AuthenticationService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -80,8 +84,14 @@ public class UserDao {
@Autowired @Autowired
private AuthenticationService authenticationService; private AuthenticationService authenticationService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {
if (StringUtils.isEmpty(userReq.getHubUuid())) { if (StringUtils.isEmpty(userReq.getHubUuid())) {
userReq.setHubUuid(defaultHubUuid); userReq.setHubUuid(defaultHubUuid);
} }
@@ -94,13 +104,23 @@ public class UserDao {
log.info("User created with ID: {}", userEntity.getId()); log.info("User created with ID: {}", userEntity.getId());
LoginReq loginReq = new LoginReq(); LoginReq loginReq = new LoginReq();
loginReq.setEmail(userEntity.getEmail()); loginReq.setEmail(userEntity.getEmail());
LoginAttemptEntity loginAttemptEntity = null;
if (userEntity != null) { if (userEntity != null) {
LoginAttemptEntity loginAttemptEntity =authenticationService.prepareLoginAttemptEntity(loginReq, request); loginAttemptEntity = authenticationService.prepareLoginAttemptEntity(loginReq, request);
log.info("Authentication failed for email: {}", loginReq.getEmail()); log.info("Authentication failed for email: {}", loginReq.getEmail());
loginAttemptEntity.setUserId(userEntity.getId()); loginAttemptEntity.setUserId(userEntity.getId());
authenticationService.createSuccessLoginAttempt(loginAttemptEntity); authenticationService.createSuccessLoginAttempt(loginAttemptEntity);
} }
return authService.getJWTTokenBean(userEntity, Boolean.TRUE);
JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId());
/** This code is responsible for adding a version history log for the "Create beneficiary" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(beneficiary).build());
/** This code is responsible for adding a version history log for the "Create user" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(userEntity).build());
return token;
} }
private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) {
@@ -195,6 +215,7 @@ public class UserDao {
public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) {
log.info("Updating user with ID: {}", userId); log.info("Updating user with ID: {}", userId);
UserEntity userEntity=validateUser(userId); UserEntity userEntity=validateUser(userId);
UserEntity oldUserEntity = Utils.getClonedEntityForData(userEntity);
log.info("Current user details: {}", userEntity); log.info("Current user details: {}", userEntity);
log.info("New user details: {}", userReq); log.info("New user details: {}", userReq);
String newStatus = userReq.getStatus() != null ? userReq.getStatus().getValue() : null; String newStatus = userReq.getStatus() != null ? userReq.getStatus().getValue() : null;
@@ -217,6 +238,10 @@ public class UserDao {
} }
setIfUpdated(userEntity.getBeneficiary()::getEmailPec, userEntity.getBeneficiary()::setEmailPec, userReq.getEmailPec()); setIfUpdated(userEntity.getBeneficiary()::getEmailPec, userEntity.getBeneficiary()::setEmailPec, userReq.getEmailPec());
userEntity = userRepository.save(userEntity); userEntity = userRepository.save(userEntity);
/** This code is responsible for adding a version history log for the "Update user details" operation **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(oldUserEntity).newData(userEntity).build());
log.info("User updated with ID: {}", userEntity.getId()); log.info("User updated with ID: {}", userEntity.getId());
return convertUserEntityToUserResponse(userEntity); return convertUserEntityToUserResponse(userEntity);
} }
@@ -304,7 +329,11 @@ public class UserDao {
public void deleteUser(Long id) { public void deleteUser(Long id) {
log.info("Deleting user with ID: {}", id); log.info("Deleting user with ID: {}", id);
validateUser(id); UserEntity oldUserData = validateUser(id);
/** This code is responsible for adding a version history log for the "Delete user" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.DELETE).oldData(oldUserData).build());
userRepository.deleteById(id); userRepository.deleteById(id);
log.info("User deleted with ID: {}", id); log.info("User deleted with ID: {}", id);
} }

View File

@@ -1,9 +1,14 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import feign.FeignException; import feign.FeignException;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.service.feignClient.VatCheckService; import net.gepafin.tendermanagement.service.feignClient.VatCheckService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -38,9 +43,14 @@ public class VatCheckDao {
public final Logger log = LoggerFactory.getLogger(VatCheckDao.class); public final Logger log = LoggerFactory.getLogger(VatCheckDao.class);
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest request;
public Map<String, Object> checkVatNumberApi(String vatNumber) { public Map<String, Object> checkVatNumberApi(String vatNumber) {
if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) { if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) {
return new HashMap<>(); return new HashMap<>();
} }
@@ -50,12 +60,12 @@ public class VatCheckDao {
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON); headers.setContentType(MediaType.APPLICATION_JSON);
headers.set(GepafinConstant.AUTHORIZATION, "Bearer " + vatCheckNewToken); headers.set(GepafinConstant.AUTHORIZATION, "Bearer " + vatCheckNewToken);
headers.add(org.apache.http.HttpHeaders.USER_AGENT, headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0");
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0");
URI baseUrl = URI.create(GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL); URI baseUrl = URI.create(GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL);
ResponseEntity<Map<String, Object>> response = vatCheckService.checkVatNumber(baseUrl, vatNumber, headers); ResponseEntity<Map<String, Object>> response = vatCheckService.checkVatNumber(baseUrl, vatNumber, headers);
if (response.getStatusCode() == HttpStatus.OK && response.hasBody()) { if (response.getStatusCode() == HttpStatus.OK && response.hasBody()) {
log.info("Successfully checked vat number"); log.info("Successfully checked vat number");
Map<String, Object> responseMap = response.getBody(); Map<String, Object> responseMap = response.getBody();

View File

@@ -47,4 +47,7 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity {
@JoinColumn(name = "PROTOCOL_Id") @JoinColumn(name = "PROTOCOL_Id")
private ProtocolEntity protocol; private ProtocolEntity protocol;
@Column(name = "end_date")
private LocalDateTime endDate;
} }

View File

@@ -13,9 +13,8 @@ public class ApplicationEntity extends BaseEntity {
@Column(name = "USER_ID") @Column(name = "USER_ID")
private Long userId; private Long userId;
@ManyToOne @Column(name = "COMPANY_ID")
@JoinColumn(name = "COMPANY_ID", nullable = false) private Long companyId;
private CompanyEntity company;
@Column(name = "SUBMISSION_DATE") @Column(name = "SUBMISSION_DATE")
private LocalDateTime submissionDate; private LocalDateTime submissionDate;
@@ -39,4 +38,8 @@ public class ApplicationEntity extends BaseEntity {
@Column(name = "HUB_ID") @Column(name = "HUB_ID")
private Long hubId; private Long hubId;
@ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany;
} }

View File

@@ -3,6 +3,8 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime;
@Data @Data
@Entity @Entity
@Table(name = "application_evaluation") @Table(name = "application_evaluation")
@@ -39,4 +41,21 @@ public class ApplicationEvaluationEntity extends BaseEntity{
@JoinColumn(name = "assigned_applications_id", nullable = true) @JoinColumn(name = "assigned_applications_id", nullable = true)
private AssignedApplicationsEntity assignedApplicationsEntity; private AssignedApplicationsEntity assignedApplicationsEntity;
@Column(name = "INITIAL_DAYS")
private Long initialDays;
@Column(name = "REMAINING_DAYS")
private Long remainingDays;
@Column(name = "SUSPENDED_DAYS")
private Long suspendedDays;
@Column(name = "START_DATE")
private LocalDateTime startDate;
@Column(name = "END_DATE")
private LocalDateTime endDate;
@Column(name = "STOP_DATE_TIME")
private LocalDateTime stopDateTime;
} }

View File

@@ -34,6 +34,11 @@ public class BeneficiaryPreferredCallEntity extends BaseEntity{
@Column(name = "STATUS", length = 255) @Column(name = "STATUS", length = 255)
private String status; private String status;
@Column(name="IS_DELETED") @Column(name="IS_DELETED")
private Boolean isDeleted; private Boolean isDeleted;
@ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany;
} }

View File

@@ -45,5 +45,9 @@ public class FaqEntity extends BaseEntity {
@Column(name ="COMPANY_ID") @Column(name ="COMPANY_ID")
private Long companyId; private Long companyId;
@ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany;
} }

View File

@@ -1,21 +1,14 @@
package net.gepafin.tendermanagement.entities; package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter; import lombok.Data;
import lombok.Setter;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Entity @Entity
@Table(name = "LOGIN_ATTEMPT") @Table(name = "LOGIN_ATTEMPT")
@Getter @Data
@Setter public class LoginAttemptEntity extends BaseEntity{
public class LoginAttemptEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", unique = true)
private Long id;
@Column(name = "USERNAME") @Column(name = "USERNAME")
private String username; private String username;

View File

@@ -0,0 +1,46 @@
package net.gepafin.tendermanagement.entities;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name = "user_action")
public class UserActionEntity extends BaseEntity {
@Column(name = "USER_ID")
private Long userId;
@Column(name = "ACTION_TYPE")
private String actionType;
@Column(name = "REQUEST_BODY")
private String requestBody;
@Column(name = "LOGIN_ATTEMPT_ID")
private Long loginAttemptId;
@Column(name = "IP_ADDRESS")
private String ipAddress;
@Column(name = "METHOD_TYPE")
private String methodType;
@Column(name = "HUB_ID")
private Long hubId;
@Column(name = "URL")
private String url;
@Column(name = "ACTION_CONTEXT")
private String actionContext;
@Column(name = "RESPONSE")
private String response;
@Column(name = "IS_DELETED", nullable = false)
private Boolean isDeleted = false;
}

View File

@@ -1,8 +1,6 @@
package net.gepafin.tendermanagement.entities; package net.gepafin.tendermanagement.entities;
import jakarta.persistence.Column; import jakarta.persistence.*;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data; import lombok.Data;
@Data @Data
@@ -28,4 +26,7 @@ public class UserCompanyDelegationEntity extends BaseEntity{
@Column(name="STATUS") @Column(name="STATUS")
private String status; private String status;
@ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany;
} }

View File

@@ -0,0 +1,36 @@
package net.gepafin.tendermanagement.entities;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name = "version_history")
public class VersionHistoryEntity extends BaseEntity {
@Column(name = "OLD_DATA", columnDefinition = "LONGTEXT")
private String oldData;
@Column(name = "NEW_DATA", columnDefinition = "LONGTEXT")
private String newData;
@Column(name = "TABLE_NAME")
private String tableName;
@Column(name = "ACTION_TYPE")
private String actionType;
@Column(name = "RECORD_ID")
private Long recordId;
@Column(name = "USER_ACTION_ID")
private Long userActionId;
@Column(name = "USER_ID")
private Long userId;
@Column(name = "IS_DELETED", nullable = false)
private Boolean isDeleted = false;
}

View File

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonValue;
public enum ApplicationEvaluationStatusTypeEnum { public enum ApplicationEvaluationStatusTypeEnum {
OPEN ("OPEN"), OPEN ("OPEN"),
SOCCORSO("SOCCORSO"), SOCCORSO("SOCCORSO"),
EXPIRED("EXPIRED"),
CLOSE("CLOSE"); CLOSE("CLOSE");
private String value; private String value;

View File

@@ -3,7 +3,11 @@ package net.gepafin.tendermanagement.enums;
public enum DocOtherSourceTypeEnum { public enum DocOtherSourceTypeEnum {
USER_SIGNED_DOCUMENT("USER_SIGNED_DOCUMENT"), USER_SIGNED_DOCUMENT("USER_SIGNED_DOCUMENT"),
USER_DELEGATION("USER_DELEGATION"), USER_DELEGATION("USER_DELEGATION"),
TEMPLATE("TEMPLATE"); TEMPLATE("TEMPLATE"),
DELETED_USER_DELEGATION("DELETED_USER_DELEGATION"),
DELETED_APPLICATION("DELETED_APPLICATION"),
DELETED_CALL("DELETED_CALL"),
DELETED_AMENDMENT("DELETED_AMENDMENT");
private String value; private String value;

View File

@@ -3,7 +3,9 @@ package net.gepafin.tendermanagement.enums;
public enum DocumentSourceTypeEnum { public enum DocumentSourceTypeEnum {
CALL("CALL"), CALL("CALL"),
APPLICATION("APPLICATION"); APPLICATION("APPLICATION"),
AMENDMENT("AMENDMENT");
private String value; private String value;

View File

@@ -0,0 +1,168 @@
package net.gepafin.tendermanagement.enums;
import com.fasterxml.jackson.annotation.JsonValue;
public enum UserActionContextEnum {
/** call action context **/
CREATE_CALL_STEP_1("CREATE_CALL_STEP_1"),
UPDATE_CALL_STEP_1("UPDATE_CALL_STEP_1"),
CREATE_UPDATE_CALL_STEP_2("CREATE_UPDATE_CALL_STEP_2"),
VALIDATE_CALL("VALIDATE_CALL"),
UPDATE_CALL_STATUS("UPDATE_CALL_STATUS"),
GET_CALL("GET_CALL"),
DOWNLOAD_CALL_DOCUMENT("DOWNLOAD_CALL_DOCUMENT"),
/** user action context **/
CREATE_USER("CREATE_USER"),
USER_LOGIN("USER_LOGIN"),
LOGOUT_USER("LOGOUT_USER"),
GET_USER("GET_USER"),
UPDATE_USER_DETAILS("UPDATE_USER_DETAILS"),
DELETE_USER("DELETE_USER"),
VALIDATE_NEW_USER_WITH_SPID_TOKEN("VALIDATE_NEW_USER_WITH_SPID_TOKEN"),
VALIDATE_EXISTING_USER_WITH_SPID_TOKEN("VALIDATE_EXISTING_USER_WITH_SPID_TOKEN"),
GET_VALID_USER_DETAILS("GET_VALID_USER_DETAILS"),
GET_ALL_USERS_BY_ROLE("GET_ALL_USERS_BY_ROLE"),
/** application action context **/
GET_APPLICATION("GET_APPLICATION"),
CREATE_UPDATE_APPLICATION_FORM("CREATE_UPDATE_APPLICATION_FORM"),
CREATE_APPLICATION("CREATE_APPLICATION"),
DELETE_APPLICATION("DELETE_APPLICATION"),
GET_ALL_APPLICATION("GET_ALL_APPLICATION"),
UPDATE_APPLICATION_STATUS("UPDATE_APPLICATION_STATUS"),
VALIDATE_APPLICATION("VALIDATE_APPLICATION"),
UPLOAD_SIGNED_DOCUMENT("UPLOAD_SIGNED_DOCUMENT"),
DOWNLOAD_PDF("DOWNLOAD_PDF"),
GET_SIGNED_DOCUMENT("GET_SIGNED_DOCUMENT"),
GET_NEXT_PREVIOUS_FORM("GET_NEXT_PREVIOUS_FORM"),
DOWNLOAD_APPLICATION_DOC_ZIP("DOWNLOAD_APPLICATION_DOC_ZIP"),
/** FAQ action context **/
CREATE_FAQ("CREATE_FAQ"),
GET_FAQ("GET_FAQ"),
UPDATE_FAQ_DETAILS("UPDATE_FAQ_DETAILS"),
DELETE_FAQ("DELETE_FAQ"),
/** company action context **/
CREATE_COMPANY("CREATE_COMPANY"),
GET_COMPANY("GET_COMPANY"),
UPDATE_COMPANY("UPDATE_COMPANY"),
DELETE_COMPANY("DELETE_COMPANY"),
UPLOAD_COMPANY_DELEGATION("UPLOAD_COMPANY_DELEGATION"),
DOWNLOAD_COMPANY_DELEGATION_TEMPLATE("DOWNLOAD_COMPANY_DELEGATION_TEMPLATE"),
GET_COMPANY_DELEGATION("GET_COMPANY_DELEGATION"),
DELETE_COMPANY_DELEGATION("DELETE_COMPANY_DELEGATION"),
CHECK_COMPANY_VAT_NUMBER("CHECK_COMPANY_VAT_NUMBER"),
GET_COMPANY_BY_USER("GET_COMPANY_BY_USER"),
REMOVE_COMPANY_FROM_USER("REMOVE_COMPANY_FROM_USER"),
/** LookUpData action context **/
CREATE_LOOKUP_DATA("CREATE_LOOKUP_DATA"),
DELETE_LOOKUP_DATA("DELETE_LOOKUP_DATA"),
UPDATE_LOOKUP_DATA("UPDATE_LOOKUP_DATA"),
GET_LOOKUP_DATA("GET_LOOKUP_DATA"),
GET_LOOKUP_DATA_BY_TYPE("GET_LOOKUP_DATA_BY_TYPE"),
/** Hub action context **/
CREATE_HUB("CREATE_HUB"),
GET_HUB("GET_HUB"),
DELETE_HUB("DELETE_HUB"),
UPDATE_HUB("UPDATE_HUB"),
GET_ALL_HUB("GET_ALL_HUB"),
GET_HUB_BY_UUID(" GET_HUB_BY_UUID"),
/** amendment action context **/
CREATE_AMENDMENT("CREATE_AMENDMENT"),
GET_AMENDMENT(" GET_AMENDMENT"),
CLOSE_AMENDMENT("CLOSE_AMENDMENT"),
UPDATE_AMENDMENT("UPDATE_AMENDMENT"),
DELETE_AMENDMENT("DELETE_AMENDMENT"),
UPDATE_AMENDMENT_STATUS("UPDATE_AMENDMENT_STATUS"),
GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID("GET_AMENDMENT_BY_PREINSTRUCTOR_USER_ID"),
GET_ALL_AMENDMENT_BY_BENEFICIARY_USER_ID("GET_AMENDMENT_BY_BENEFICIARY_USER_ID"),
GET_AMENDMENT_BY_APPLICATION_ID("GET_AMENDMENT_BY_APPLICATION_ID"),
EXTEND_RESPONSE_DAYS_FOR_AMENDMENT("EXTEND_RESPONSE_DAYS_FOR_AMENDMENT"),
GET_APPLICATION_DATA_FOR_AMENDMENT("GET_APPLICATION_DATA_FOR_AMENDMENT"),
/** Application Evaluation action context **/
CREATE_UPDATE_APPLICATION_EVALUATION("CREATE_UPDATE_APPLICATION_EVALUATION"),
GET_APPLICATION_EVALUATION("GET_APPLICATION_EVALUATION"),
DELETE_APPLICATION_EVALUATION("DELETE_APPLICATION_EVALUATION"),
/** Beneficiary Preferred Call action context **/
CREATE_BENEFICIARY_PREFERRED_CALL("CREATE_BENEFICIARY_PREFERRED_CALL"),
DELETE_BENEFICIARY_PREFERRED_CALL("DELETE_BENEFICIARY_PREFERRED_CALL"),
GET_BENEFICIARY_PREFERRED_CALL("GET_BENEFICIARY_PREFERRED_CALL"),
UPDATE_BENEFICIARY_PREFERRED_CALL("UPDATE_BENEFICIARY_PREFERRED_CALL"),
/** Assigned Application action context **/
CREATE_ASSIGNED_APPLICATION("CREATE_ASSIGNED_APPLICATION"),
DELETE_ASSIGNED_APPLICATION("DELETE_ASSIGNED_APPLICATION"),
GET_ASSIGNED_APPLICATION("GET_ASSIGNED_APPLICATION"),
UPDATE_ASSIGNED_APPLICATION_DETAILS("UPDATE_ASSIGNED_APPLICATION_DETAILS"),
/** Assigned form field context **/
CREATE_FORM_FIELD("CREATE_FORM_FIELD"),
UPDATE_FORM_FIELD("UPDATE_FORM_FIELD"),
GET_FORM_FIELD("GET_FORM_FIELD"),
DELETE_FORM_FIELD("DELETE_FORM_FIELD"),
/** Document action context **/
UPLOAD_CALL_DOCUMENT("UPLOAD_CALL_DOCUMENT"),
UPLOAD_CALL_IMAGES("UPLOAD_CALL_IMAGES"),
UPLOAD_APPLICATION_DOCUMENT("UPLOAD_APPLICATION_DOCUMENT"),
UPLOAD_APPLICATION_IMAGES("UPLOAD_APPLICATION_IMAGES"),
DELETE_DOCUMENT("DELETE_DOCUMENT"),
UPDATE_DOCUMENT("UPDATE_DOCUEMENT"),
UPDATE_IMAGES("UPDATE_IMAGES"),
GET_DOCUMENT("GET_DOCUMENT"),
/** Assigned flow context **/
CREATE_UPDATE_FLOW("CREATE_UPDATE_FLOW"),
GET_FLOW("GET_FLOW"),
/** Login attempt action context **/
GET_LOGIN_ATTEMPT_LIST("GET_LOGIN_ATTEMPT_LIST"),
ADD_LOGIN_ATTEMPT("ADD_LOGIN_ATTEMPT"),
/** Dashboard action context **/
GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN("GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN"),
GET_DASHBOARD_WIDGET_FOR_BENEFICIARY("GET_DASHBOARD_WIDGET_FOR_BENEFICIARY"),
/** Evaluation criteria action context **/
GET_EVALUATION_CRITERIA("GET_EVALUATION_CRITERIA"),
UPDATE_EVALUATION_CRITERIA("UPDATE_EVALUATION_CRITERIA"),
DELETE_EVALUATION_CRITERIA("DELETE_EVALUATION_CRITERIA"),
CREATE_EVALUATION_CRITERIA("CREATE_EVALUATION_CRITERIA"),
/** communication action context **/
ADD_COMMENT_TO_AMENDMENT_REQUEST("ADD_COMMENT_TO_AMENDMENT_REQUEST"),
UPDATE_COMMUNICATION_COMMENT("UPDATE_COMMUNICATION_COMMENT"),
GET_AMENDMENT_COMMENT("GET_AMENDMENT_COMMENT"),
DELETE_COMMENT_FROM_AMENDMENT("DELETE_COMMENT_FROM_AMENDMENT"),
/** form action context **/
GET_FORM("GET_FORM"),
CREATE_FORM("CREATE_FORM"),
UPDATE_FORM("UPDATE_FORM"),
DELETE_FORM("DELETE_FORM"),
/** scheduler action context **/
AMENDMENT_EXPIRATION_SCHEDULER("AMENDMENT_EXPIRATION_SCHEDULER"),
EVALUATION_EXPIRATION_SCHEDULER("EVALUATION_EXPIRATION_SCHEDULER");
private final String value;
UserActionContextEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,29 @@
package net.gepafin.tendermanagement.enums;
import com.fasterxml.jackson.annotation.JsonValue;
public enum UserActionLogsEnum {
LOGIN("LOGIN"),
LOGOUT("LOGOUT"),
UPDATE("UPDATE"),
DELETE("DELETE"),
VIEW("VIEW"),
INSERT("INSERT"),
DOWNLOAD("DOWNLOAD"),
UPLOAD("UPLOAD"),
SCHEDULER("SCHEDULER"),
SCRIPT("SCRIPT");
private final String value;
UserActionLogsEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,23 @@
package net.gepafin.tendermanagement.enums;
import com.fasterxml.jackson.annotation.JsonValue;
public enum VersionActionTypeEnum {
UPDATE("UPDATE"),
DELETE("DELETE"),
SOFT_DELETE("SOFT_DELETE"),
INSERT("INSERT");
private final String value;
VersionActionTypeEnum(String value) {
this.value = value;
}
@JsonValue
public String getValue() {
return value;
}
}

View File

@@ -0,0 +1,17 @@
package net.gepafin.tendermanagement.model.request;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Builder;
import lombok.Data;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
@Data
@Builder
public class UserActionRequest {
private HttpServletRequest request;
private UserActionLogsEnum actionType;
private UserActionContextEnum actionContext;
private Object response;
}

View File

@@ -0,0 +1,16 @@
package net.gepafin.tendermanagement.model.request;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Builder;
import lombok.Data;
import net.gepafin.tendermanagement.entities.BaseEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
@Data
@Builder
public class VersionHistoryRequest {
private BaseEntity oldData;
private BaseEntity newData;
private VersionActionTypeEnum actionType;
private HttpServletRequest request;
}

View File

@@ -23,6 +23,7 @@ public class ApplicationAmendmentRequestResponse {
private List<ApplicationFormFieldResponseBean> applicationFormFields; private List<ApplicationFormFieldResponseBean> applicationFormFields;
private Long applicationId; private Long applicationId;
private Long applicationEvaluationId; private Long applicationEvaluationId;
private LocalDateTime evaluationEndDate;
private LocalDateTime expirationDate; private LocalDateTime expirationDate;
private List<CommunicationResponseBean> commentsList; private List<CommunicationResponseBean> commentsList;
private String internalNote; private String internalNote;

View File

@@ -28,6 +28,6 @@ public class ApplicationEvaluationResponse {
private String callName; private String callName;
private String motivation; private String motivation;
private LocalDateTime submissionDate; private LocalDateTime submissionDate;
private LocalDateTime evaluationDate; private LocalDateTime evaluationEndDate;
private LocalDateTime callEndDate; private LocalDateTime callEndDate;
} }

View File

@@ -21,6 +21,7 @@ public class AssignedApplicationsResponse extends BaseBean {
private LocalDateTime callStartDate; private LocalDateTime callStartDate;
private LocalDateTime callEndDate; private LocalDateTime callEndDate;
private String companyName; private String companyName;
private LocalDateTime evaluationEndDate;
} }

View File

@@ -20,6 +20,7 @@ public class BeneficiaryPreferredCallResponseBean {
private BeneficiaryCallStatus status; private BeneficiaryCallStatus status;
private LocalDateTime createdDate; private LocalDateTime createdDate;
private LocalDateTime updatedDate; private LocalDateTime updatedDate;
private Long userWithCompanyId;
} }

View File

@@ -10,6 +10,8 @@ public class CommunicationResponseBean {
private String comment; private String comment;
private Long id;
private String title; private String title;
private LocalDateTime createdDate; private LocalDateTime createdDate;
@@ -21,7 +23,8 @@ public class CommunicationResponseBean {
private Long receiverUserId; private Long receiverUserId;
private Long amendmentId; private Long amendmentId;
public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId) {
public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId, Long id) {
this.commentedDate = commentedDate; this.commentedDate = commentedDate;
this.comment = comment; this.comment = comment;
@@ -29,9 +32,10 @@ public class CommunicationResponseBean {
this.createdDate = createdDate; this.createdDate = createdDate;
this.updatedDate = updatedDate; this.updatedDate = updatedDate;
this.amendmentId = amendmentId; this.amendmentId = amendmentId;
this.id = id;
} }
public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId,Long senderUserId,Long receiverUserId) { public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId,Long senderUserId,Long receiverUserId, Long id) {
this.commentedDate = commentedDate; this.commentedDate = commentedDate;
this.comment = comment; this.comment = comment;
@@ -41,6 +45,7 @@ public class CommunicationResponseBean {
this.amendmentId = amendmentId; this.amendmentId = amendmentId;
this.senderUserId = senderUserId; this.senderUserId = senderUserId;
this.receiverUserId = receiverUserId; this.receiverUserId = receiverUserId;
this.id = id;
} }
public CommunicationResponseBean() { public CommunicationResponseBean() {

View File

@@ -0,0 +1,28 @@
package net.gepafin.tendermanagement.model.util;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import java.io.Serial;
import java.io.Serializable;
@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class LogResponse<T> implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Integer status;
private String statusCode;
private String message;
}

View File

@@ -1,13 +1,18 @@
package net.gepafin.tendermanagement.repositories; package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
public interface ApplicationAmendmentRequestRepository extends JpaRepository<ApplicationAmendmentRequestEntity,Long>, JpaSpecificationExecutor<ApplicationAmendmentRequestEntity> { public interface ApplicationAmendmentRequestRepository extends JpaRepository<ApplicationAmendmentRequestEntity,Long>, JpaSpecificationExecutor<ApplicationAmendmentRequestEntity> {
Optional<ApplicationAmendmentRequestEntity> findByIdAndIsDeletedFalse(Long id); Optional<ApplicationAmendmentRequestEntity> findByIdAndIsDeletedFalse(Long id);
@@ -25,6 +30,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository<App
@Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " + @Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " +
"WHERE amr.applicationEvaluationEntity.id = :id " + "WHERE amr.applicationEvaluationEntity.id = :id " +
"AND amr.isDeleted = false " +
"AND amr.applicationEvaluationEntity.isDeleted = false") "AND amr.applicationEvaluationEntity.isDeleted = false")
List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id); List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id);
@@ -34,4 +40,38 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository<App
List<ApplicationAmendmentRequestEntity> findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List<String> statuses); List<ApplicationAmendmentRequestEntity> findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List<String> statuses);
@Query("SELECT app " +
"FROM ApplicationEntity app " +
"WHERE app.id = (SELECT aar.applicationId " +
"FROM ApplicationAmendmentRequestEntity aar " +
"WHERE aar.id = :amendmentId)")
ApplicationEntity findApplicationByAmendmentId(Long amendmentId);
@Query(value = "SELECT amr " +
"FROM ApplicationAmendmentRequestEntity amr " +
"WHERE amr.applicationEvaluationEntity.id = :id " +
"AND amr.isDeleted = false " +
"AND amr.applicationEvaluationEntity.isDeleted = false " +
"AND amr.status = :status")
List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(Long id, String status);
@Query("SELECT a FROM ApplicationAmendmentRequestEntity a " +
"WHERE a.isDeleted = false " +
"AND a.status <> 'CLOSE' " +
"AND a.endDate < :currentTime")
List<ApplicationAmendmentRequestEntity> findAmendmentsDueForExpiration(LocalDateTime currentTime);
@Query("SELECT DISTINCT a.applicationEvaluationEntity " +
"FROM ApplicationAmendmentRequestEntity a " +
"WHERE a.applicationEvaluationEntity.id IN :applicationEvaluationIds " +
"AND a.isDeleted = false " +
"AND NOT EXISTS ( " +
" SELECT 1 FROM ApplicationAmendmentRequestEntity activeAmendment" +
" WHERE activeAmendment.applicationEvaluationEntity.id = a.applicationEvaluationEntity.id " +
" AND activeAmendment.status <> 'CLOSE' " +
" AND activeAmendment.isDeleted = false) ")
Set<ApplicationEvaluationEntity> findEvaluationsWithoutActiveAmendmentsByIds(@Param("applicationEvaluationIds") Set<Long> applicationEvaluationIds);
} }

View File

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -21,5 +22,6 @@ public interface ApplicationEvaluationRepository extends JpaRepository<Applicati
Optional<ApplicationEvaluationEntity> findFirstByIsDeletedFalseOrderByCreatedDateDesc(); Optional<ApplicationEvaluationEntity> findFirstByIsDeletedFalseOrderByCreatedDateDesc();
boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId); boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId);
@Query("SELECT a FROM ApplicationEvaluationEntity a WHERE a.isDeleted = false AND a.endDate < :currentDate")
List<ApplicationEvaluationEntity> findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate);
} }

View File

@@ -24,15 +24,17 @@ public interface ApplicationRepository extends JpaRepository<ApplicationEntity,
public Optional<ApplicationEntity> findByIdAndUserIdAndIsDeletedFalse(Long id,Long userId); public Optional<ApplicationEntity> findByIdAndUserIdAndIsDeletedFalse(Long id,Long userId);
Optional<ApplicationEntity> findByUserIdAndCompanyIdAndCallIdAndIsDeletedFalse(Long userId, Long companyId, Long callId); Optional<ApplicationEntity> findByUserIdAndUserWithCompanyIdAndCallIdAndIsDeletedFalse(Long userId, Long userWithCompanyId, Long callId);
public Optional<ApplicationEntity> findByIdAndUserIdAndCallIdAndIsDeletedFalse(Long applicationId, Long userId, public Optional<ApplicationEntity> findByIdAndUserIdAndCallIdAndIsDeletedFalse(Long applicationId, Long userId,
Long callId); Long callId);
@Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.userId = :userId AND a.company.id = :companyId AND a.status = 'SUBMIT' AND a.isDeleted = false") @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.userId = :userId AND a.userWithCompany.id = :userWithCompanyId AND a.status = 'SUBMIT' AND a.isDeleted = false")
Long countSubmittedApplicationsByUserId(@Param("userId") Long userId, @Param("companyId") Long companyId); Long countSubmittedApplicationsByUserId(@Param("userId") Long userId, @Param("userWithCompanyId") Long userWithCompanyId);
List<ApplicationEntity> findByUserWithCompanyIdAndUserIdAndIsDeletedFalse(Long userWithCompanyId, Long userId);
List<ApplicationEntity> findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId);
@Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId AND a.isDeleted = false") @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId AND a.isDeleted = false")
public Long countSubmittedApplicationsByHubId(@Param("hubId") Long hubId); public Long countSubmittedApplicationsByHubId(@Param("hubId") Long hubId);

View File

@@ -13,12 +13,17 @@ public interface BeneficiaryPreferredCallRepository extends JpaRepository<Benefi
List<BeneficiaryPreferredCallEntity> findByBeneficiaryIdAndIsDeletedFalse(Long beneficiaryId); List<BeneficiaryPreferredCallEntity> findByBeneficiaryIdAndIsDeletedFalse(Long beneficiaryId);
List<BeneficiaryPreferredCallEntity> findByUserIdAndIsDeletedFalse(Long userId); List<BeneficiaryPreferredCallEntity> findByUserIdAndIsDeletedFalse(Long userId);
@Query("SELECT preferredCall FROM BeneficiaryPreferredCallEntity preferredCall where preferredCall.userId=:userId AND (:companyId is null OR preferredCall.companyId=:companyId) AND isDeleted=false") @Query("SELECT preferredCall FROM BeneficiaryPreferredCallEntity preferredCall WHERE preferredCall.userId = :userId AND (:userWithCompanyId IS NULL OR preferredCall.userWithCompany.id = :userWithCompanyId) AND isDeleted = false")
List<BeneficiaryPreferredCallEntity> findByUserIdAndCompanyIdAndIsDeletedFalse(@Param("userId") Long userId, @Param("companyId") Long companyId); List<BeneficiaryPreferredCallEntity> findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(@Param("userId") Long userId, @Param("userWithCompanyId") Long userWithCompanyId);
List<BeneficiaryPreferredCallEntity> findByBeneficiaryIdAndCompanyId(Long beneficiaryId,Long companyId); List<BeneficiaryPreferredCallEntity> findByBeneficiaryIdAndCompanyId(Long beneficiaryId,Long companyId);
List<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdInAndIsDeletedFalse(Long userId, List<Long> callIds); List<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdInAndIsDeletedFalse(Long userId, List<Long> callIds);
Optional<BeneficiaryPreferredCallEntity> findByIdAndIsDeletedFalse(Long id); Optional<BeneficiaryPreferredCallEntity> findByIdAndIsDeletedFalse(Long id);
Optional<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(Long userId, Long callId, Long companyId);
List<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdInAndCompanyIdAndIsDeletedFalse(Long userId, List<Long> callIds,Long companyId); Optional<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdAndUserWithCompanyIdAndIsDeletedFalse(Long userId, Long callId, Long userWithCompanyId);
List<BeneficiaryPreferredCallEntity> findByUserIdAndCallIdInAndUserWithCompanyIdAndIsDeletedFalse(Long userId, List<Long> callIds, Long userWithCompanyId);
} }

View File

@@ -7,16 +7,14 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import java.util.List; import java.util.List;
import java.util.Optional;
public interface CommunicationRepository extends JpaRepository<CommunicationEntity, Long> { public interface CommunicationRepository extends JpaRepository<CommunicationEntity, Long> {
@Query("Select new net.gepafin.tendermanagement.model.response.CommunicationResponseBean(c.commentedDate, c.communicationComment, c.communicationTitle, c.createdDate, c.updatedDate, c.applicationAmendmentRequest.id) " +
"from CommunicationEntity c Where c.applicationAmendmentRequest.id = :applicationAmendmentRequestId")
List<CommunicationResponseBean> findCommentsByApplicationAmendmentRequestId(@Param("applicationAmendmentRequestId") Long amendmentRequestId);
@Query("SELECT new net.gepafin.tendermanagement.model.response.CommunicationResponseBean( " + "c.commentedDate, c.communicationComment, c.communicationTitle, c.createdDate, c" + @Query("SELECT new net.gepafin.tendermanagement.model.response.CommunicationResponseBean( " + "c.commentedDate, c.communicationComment, c.communicationTitle, c.createdDate, c" +
".updatedDate, c.applicationAmendmentRequest.id,c.senderUserId, c.receiverUserId) " + "FROM CommunicationEntity c " + "WHERE c.applicationAmendmentRequest.id = :amendmentId AND c.isDeleted = false") ".updatedDate, " + "c.applicationAmendmentRequest.id, c.senderUserId, c.receiverUserId, c.id " + ") " + "FROM CommunicationEntity c " + "WHERE c" +
".applicationAmendmentRequest.id = :amendmentId AND c.isDeleted = false")
List<CommunicationResponseBean> findCommentListDetailsByAmendmentId(@Param("amendmentId") Long amendmentId); List<CommunicationResponseBean> findCommentListDetailsByAmendmentId(@Param("amendmentId") Long amendmentId);
Optional<CommunicationEntity> findByIdAndIsDeletedFalse(Long commentId);
} }

View File

@@ -28,6 +28,10 @@ public interface DocumentRepository extends JpaRepository<DocumentEntity, Long>
@Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = false") @Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = false")
List<DocumentEntity> findAllByIsDeleteFalse(); List<DocumentEntity> findAllByIsDeleteFalse();
@Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = true")
List<DocumentEntity> findAllByIsDeleteTrue();
List<DocumentEntity> findAllByIdInAndIsDeletedFalse(Set<Long> documentIds); List<DocumentEntity> findAllByIdInAndIsDeletedFalse(Set<Long> documentIds);
} }

View File

@@ -19,6 +19,8 @@ public interface FaqRepository extends JpaRepository<FaqEntity, Long> {
List<FaqEntity> findByCallIdAndIsDeletedFalse(Long callId); List<FaqEntity> findByCallIdAndIsDeletedFalse(Long callId);
Optional<FaqEntity> findByIdAndCallIdAndIsDeletedFalse(Long id, Long callId); Optional<FaqEntity> findByIdAndCallIdAndIsDeletedFalse(Long id, Long callId);
List<FaqEntity> findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId);
List<FaqEntity> findByUserWithCompanyIdAndIsDeletedFalse(Long userWithCompanyId);
} }

View File

@@ -0,0 +1,10 @@
package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.UserActionEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserActionsRepository extends JpaRepository<UserActionEntity, Long> {
UserActionEntity findUserActionById(Long id);
}

View File

@@ -9,7 +9,7 @@ import java.util.List;
public interface UserCompanyDelegationRepository extends JpaRepository<UserCompanyDelegationEntity, Long> { public interface UserCompanyDelegationRepository extends JpaRepository<UserCompanyDelegationEntity, Long> {
UserCompanyDelegationEntity findByUserIdAndCompanyIdAndStatus(Long userId, Long companyId, String status); UserCompanyDelegationEntity findByUserIdAndUserWithCompanyIdAndStatus(Long userId, Long userWithCompanyId, String status);
@Query("SELECT d FROM UserCompanyDelegationEntity d where d.status = :status") @Query("SELECT d FROM UserCompanyDelegationEntity d where d.status = :status")
List<UserCompanyDelegationEntity> findAllByStatus(@Param("status") String status); List<UserCompanyDelegationEntity> findAllByStatus(@Param("status") String status);

View File

@@ -0,0 +1,16 @@
package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.VersionHistoryEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface VersionHistoryRepository extends JpaRepository<VersionHistoryEntity, Long> {
List<VersionHistoryEntity> findVersionHistoryById(Long id);
List<VersionHistoryEntity> findVersionHistoryByUserActionIdAndUserIdNull(Long id);
List<VersionHistoryEntity> findVersionHistoryByUserActionId(Long id);
}

View File

@@ -0,0 +1,122 @@
package net.gepafin.tendermanagement.scheduler;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao;
import net.gepafin.tendermanagement.dao.EmailNotificationDao;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
@Component
public class ApplicationAmendmentScheduler {
@Autowired
private HttpServletRequest httpServletRequest;
@Autowired
private ApplicationAmendmentRequestRepository applicationAmendmentRepository;
@Autowired
private EmailNotificationDao emailNotificationDao;
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
@Autowired
private LoggingUtil loggingUtil;
private static final Logger log = LoggerFactory.getLogger(ApplicationAmendmentScheduler.class);
@Scheduled(cron = "0 0 1 * * ?")
public void processAmendmentExpirationScheduler() {
log.info("Starting the Application Amendment Expiration scheduler.");
try {
Utils.setHttpServletRequestForScheduler();
/** This code is responsible for creating user action logs for the "Application Amendment Expiration scheduler" operation. **/
loggingUtil.logUserActionWithoutToken(
UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER).actionContext(UserActionContextEnum.AMENDMENT_EXPIRATION_SCHEDULER).build());
List<ApplicationAmendmentRequestEntity> amendmentRequestList = applicationAmendmentRepository
.findAmendmentsDueForExpiration(
DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5));
processAmendmentsForExpiration(amendmentRequestList);
log.info("Application Amendment Expiration scheduler completed successfully.");
} catch (Exception e) {
log.error("An error occurred during the Application Amendment Expiration scheduler: {}", e.getMessage(), e);
}
Utils.clearHttpServletRequest();
}
private void processAmendmentsForExpiration(List<ApplicationAmendmentRequestEntity> amendmentRequests) {
log.info("Starting the process of expiring application amendments.");
amendmentRequests.forEach(request -> {
try {
ApplicationAmendmentRequestEntity oldAmendmentRequestEntity = Utils.getClonedEntityForData(request);
request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue());
request = applicationAmendmentRepository.save(request);
/** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAmendmentRequestEntity).newData(request).build());
emailNotificationDao.sendApplicationFailureNotificationEmail(request);
log.info("Updated status to CLOSED for ApplicationAmendmentRequest with ID: {}", request.getId());
} catch (Exception e) {
log.error("Error expiring ApplicationAmendmentRequest with ID {}: {}", request.getId(), e.getMessage(),
e);
}
});
log.info("Completed the process of updating expiring application amendments.");
log.info("Starting the process of updating EndDate in ApplicationEvaluations.");
try {
Set<Long> applicationEvaluationIds = amendmentRequests.stream()
.map(request -> request.getApplicationEvaluationEntity().getId()).collect(Collectors.toSet());
Set<ApplicationEvaluationEntity> evaluationsWithoutActiveAmendmentList = applicationAmendmentRepository
.findEvaluationsWithoutActiveAmendmentsByIds(applicationEvaluationIds);
evaluationsWithoutActiveAmendmentList.forEach(evaluation -> {
try {
applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(evaluation);
log.info("Updated EndDate and suspension days for ApplicationEvaluation with ID: {}",
evaluation.getId());
} catch (Exception e) {
log.error("Error updating EndDate for ApplicationEvaluation with ID {}: {}", evaluation.getId(),
e.getMessage(), e);
}
});
log.info("Completed the process of updating EndDate in ApplicationEvaluations.");
} catch (Exception e) {
log.error("An error occurred while updating EndDate in ApplicationEvaluations: {}", e.getMessage(), e);
}
}
}

View File

@@ -0,0 +1,99 @@
package net.gepafin.tendermanagement.scheduler;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
@Component
public class ApplicationEvaluationScheduler {
@Autowired
private ApplicationEvaluationRepository applicationEvaluationRepository;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private HttpServletRequest httpServletRequest;
private static final Logger log = LoggerFactory.getLogger(ApplicationEvaluationScheduler.class);
@Scheduled(cron = "0 0 2 * * ?") // Runs daily at midnight
public void updateExpiredEvaluations() {
log.info("Starting the Application Evaluation Expiration scheduler...");
try {
Utils.setHttpServletRequestForScheduler();
// Logging user action for the scheduler operation
loggingUtil.logUserActionWithoutToken(
UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER)
.actionContext(UserActionContextEnum.EVALUATION_EXPIRATION_SCHEDULER).build());
processExpiredEvaluation();
log.info("Completed the process of updating expiring application evaluations.");
} catch (Exception e) {
log.error("An error occurred during the Application Evaluation Expiration scheduler: {}", e.getMessage(),
e);
} finally {
Utils.clearHttpServletRequest();
}
}
private void processExpiredEvaluation() {
log.info("Starting the process of expiring application evaluations.");
try {
List<ApplicationEvaluationEntity> evaluations = applicationEvaluationRepository
.findAllByIsDeletedFalseAndEndDateBefore(
DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5));
log.info("Found {} evaluations to process for expiration.", evaluations.size());
for (ApplicationEvaluationEntity evaluation : evaluations) {
try {
log.debug("Processing evaluation with ID: {}", evaluation.getId());
ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils
.getClonedEntityForData(evaluation);
evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue());
evaluation = applicationEvaluationRepository.save(evaluation);
// Logging version history for the update operation
loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest)
.actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity)
.newData(evaluation).build());
log.info("Updated evaluation status to EXPIRED for ID: {}", evaluation.getId());
} catch (Exception e) {
log.error("Error processing evaluation with ID: {}. Error: {}", evaluation.getId(), e.getMessage(),
e);
}
}
} catch (Exception e) {
log.error("An error occurred while fetching evaluations for expiration. Error: {}", e.getMessage(), e);
}
}
}

View File

@@ -1,63 +0,0 @@
package net.gepafin.tendermanagement.scheduler;
import net.gepafin.tendermanagement.dao.EmailNotificationDao;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@Component
public class NotificationScheduler {
@Autowired
UserRepository userRepository;
@Autowired
ApplicationRepository applicationRepository;
@Autowired
ApplicationAmendmentRequestRepository applicationAmendmentRepository;
@Autowired
EmailNotificationDao emailNotificationDao;
@Scheduled(cron = "0 0 1 * * ?")
void sendNotificationForRejectedApplicationToBeneficiary() {
List<ApplicationEntity> applicationsList = applicationRepository.findByIsDeletedFalse();
List<ApplicationAmendmentRequestEntity> amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse();
LocalDateTime today = LocalDateTime.now();
for (ApplicationEntity application : applicationsList) {
ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList);
if (amendmentRequest != null) {
LocalDateTime requestDate = amendmentRequest.getStartDate();
if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) {
// Update the application status to REJECTED
application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue());
applicationRepository.save(application);
amendmentRequest.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue());
applicationAmendmentRepository.save(amendmentRequest);
emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest);
}
}
}
}
private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List<ApplicationAmendmentRequestEntity> amendmentRequestList) {
return amendmentRequestList.stream().filter(request -> request.getApplicationId().equals(application.getId())).findFirst().orElse(null);
}
}

View File

@@ -1,5 +1,4 @@
package net.gepafin.tendermanagement.service; package net.gepafin.tendermanagement.service;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -9,7 +8,8 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@Component @Component
public interface AmazonS3Service { public interface
AmazonS3Service {
UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file);
@@ -17,4 +17,6 @@ public interface AmazonS3Service {
InputStream getFile(String s3Folder, String filePath) throws IOException; InputStream getFile(String s3Folder, String filePath) throws IOException;
UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath);
} }

View File

@@ -32,6 +32,8 @@ public interface CompanyService {
UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId); UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId);
UserWithCompanyEntity getUserWithCompany(Long userId, Long companyId);
ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest); ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest);
CompanyDelegationResponse uploadCompanyDelegation(HttpServletRequest request, Long companyId, MultipartFile file); CompanyDelegationResponse uploadCompanyDelegation(HttpServletRequest request, Long companyId, MultipartFile file);

View File

@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.service; package net.gepafin.tendermanagement.service;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.HubEntity;
import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.request.HubReq;
import net.gepafin.tendermanagement.model.response.HubResponseBean; import net.gepafin.tendermanagement.model.response.HubResponseBean;
@@ -8,11 +9,11 @@ import net.gepafin.tendermanagement.model.response.HubResponseBean;
import java.util.List; import java.util.List;
public interface HubService { public interface HubService {
HubResponseBean createHub(HubReq hubReq); HubResponseBean createHub(HttpServletRequest request,HubReq hubReq);
HubResponseBean updateHub(Long hubId, HubReq hubReq); HubResponseBean updateHub(HttpServletRequest request,Long hubId, HubReq hubReq);
HubResponseBean getHubById(Long hubId); HubResponseBean getHubById(Long hubId);
List<HubResponseBean> getAllHubs(); List<HubResponseBean> getAllHubs();
void deleteHub(Long hubId); void deleteHub(HttpServletRequest request,Long hubId);
HubEntity getHubByUuid(String hubUuid); HubEntity getHubByUuid(String hubUuid);
HubResponseBean getHubByHubUuid(String uuid); HubResponseBean getHubByHubUuid(String uuid);
HubEntity valdateHub(Long hubId); HubEntity valdateHub(Long hubId);

View File

@@ -1,10 +1,17 @@
package net.gepafin.tendermanagement.service.impl; package net.gepafin.tendermanagement.service.impl;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.*; import com.amazonaws.services.s3.model.*;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.dao.S3PathConfig;
import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity;
import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum;
import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response;
import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
@@ -45,6 +52,18 @@ public class AmazonS3ServiceImpl implements AmazonS3Service {
@Value("${aws.s3.url}") @Value("${aws.s3.url}")
private String s3Url; private String s3Url;
@Autowired
private S3PathConfig s3ConfigBean;
@Autowired
private AmazonS3Client s3Client;
@Value("${aws.s3.region}")
private String region;
@Autowired
S3ReUploadMigrationService s3ReUploadMigrationService;
private String upload(String fileName, String s3Folder, private String upload(String fileName, String s3Folder,
MultipartFile file) throws IOException { MultipartFile file) throws IOException {
@@ -125,4 +144,39 @@ public class AmazonS3ServiceImpl implements AmazonS3Service {
Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3));
} }
} }
@Override
public UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath) {
try {
newPath = cleanNewPath(oldPath, newPath);
oldPath = cleanOldPath(oldPath);
log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName);
CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath);
s3Client.copyObject(copyRequest);
log.info("File copied successfully from {} to {}", oldPath, newPath);
s3Client.deleteObject(bucketName, oldPath);
log.info("Original file deleted successfully: {}", oldPath);
String filePath = s3Url + newPath;
return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filePath).build();
} catch (AmazonServiceException e) {
log.error("AWS service error while moving file: {}", e.getErrorMessage(), e);
throw e;
} catch (SdkClientException e) {
log.error("SDK client error while moving file: {}", e.getMessage(), e);
throw e;
} catch (Exception e) {
log.error("Unexpected error while moving file: {}", e.getMessage(), e);
throw e;
}
}
private String cleanNewPath(String oldPath, String newPath) {
return newPath + "/" + oldPath.substring(oldPath.lastIndexOf("/") + 1);
}
private String cleanOldPath(String oldPath) {
return oldPath.replace(s3Url, "");
}
} }

View File

@@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -45,6 +46,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) { public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) {
Optional<ApplicationEvaluationEntity> entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId); Optional<ApplicationEvaluationEntity> entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId);
entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId())); entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()));
@@ -52,6 +54,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) {
ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
@@ -86,6 +89,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) {
ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id);
@@ -110,6 +114,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) {
ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id)
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
@@ -123,6 +128,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) { public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) {
UserEntity user= validator.validateUser(request); UserEntity user= validator.validateUser(request);
return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); return applicationAmendmentRequestDao.extendResponseDays(id, addedDays);
@@ -132,6 +138,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm
return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId,statuses); return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId,statuses);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) {
return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationAmendmentId, status); return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationAmendmentId, status);

View File

@@ -80,15 +80,15 @@ public class ApplicationServiceImpl implements ApplicationService {
public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId,
FormActionEnum action) { FormActionEnum action) {
ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId);
validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
return flowFormDao.getNextOrPreviousForm(applicationEntity, formId, action); return flowFormDao.getNextOrPreviousForm(applicationEntity, formId, action);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
return applicationDao.updateApplicationStatus(request, applicationId, status);
return applicationDao.updateApplicationStatus(request, applicationId, status);
} }
@Override @Override

View File

@@ -15,16 +15,20 @@ import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.LoginAttemptResultEnum; import net.gepafin.tendermanagement.enums.LoginAttemptResultEnum;
import net.gepafin.tendermanagement.enums.LoginAttemptTypeEnum; import net.gepafin.tendermanagement.enums.LoginAttemptTypeEnum;
import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.LoginReq;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.CompanyResponse; import net.gepafin.tendermanagement.model.response.CompanyResponse;
import net.gepafin.tendermanagement.model.response.LoginResponse; import net.gepafin.tendermanagement.model.response.LoginResponse;
import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.RoleResponseBean;
import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.JWTToken;
import net.gepafin.tendermanagement.repositories.LoginAttemptRepository;
import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.SamlResponseRepository;
import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.HubService;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; 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.ResourceNotFoundException;
@@ -51,6 +55,7 @@ public class AuthenticationService {
private final TokenProvider tokenProvider; private final TokenProvider tokenProvider;
private final AuthenticationManager authenticationManager; private final AuthenticationManager authenticationManager;
@Autowired @Autowired
private CompanyDao companyDao; private CompanyDao companyDao;
@@ -69,6 +74,15 @@ public class AuthenticationService {
@Autowired @Autowired
private HubService hubService; private HubService hubService;
@Autowired
private HttpServletRequest request;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
LoginAttemptRepository loginAttemptRepository;
@Autowired @Autowired
public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) {
this.tokenProvider = tokenProvider; this.tokenProvider = tokenProvider;
@@ -103,7 +117,7 @@ public class AuthenticationService {
createFailedLoginAttempt(loginAttemptEntity, e.getMessage()); createFailedLoginAttempt(loginAttemptEntity, e.getMessage());
throw e; throw e;
} }
return getJWTTokenBean(user, loginReq.getRememberMe()); return getJWTTokenBean(user, loginReq.getRememberMe(), loginAttemptEntity.getId());
} }
public LoginAttemptEntity prepareLoginAttemptEntity(LoginReq loginUserReq, HttpServletRequest request) { public LoginAttemptEntity prepareLoginAttemptEntity(LoginReq loginUserReq, HttpServletRequest request) {
@@ -117,19 +131,21 @@ public class AuthenticationService {
return loginAttemptEntity; return loginAttemptEntity;
} }
public void createSuccessLoginAttempt(LoginAttemptEntity loginAttemptEntity) { public LoginAttemptEntity createSuccessLoginAttempt(LoginAttemptEntity loginAttemptEntity) {
loginAttemptEntity.setResult(LoginAttemptResultEnum.SUCCESS.getValue()); loginAttemptEntity.setResult(LoginAttemptResultEnum.SUCCESS.getValue());
loginAttemptDao.createLoginAttempt(loginAttemptEntity); return loginAttemptDao.createLoginAttempt(loginAttemptEntity);
} }
public void createFailedLoginAttempt(LoginAttemptEntity loginAttemptEntity, String errorMsg) { public void createFailedLoginAttempt(LoginAttemptEntity loginAttemptEntity, String errorMsg) {
loginAttemptEntity.setResult(LoginAttemptResultEnum.FAILED.getValue()); loginAttemptEntity.setResult(LoginAttemptResultEnum.FAILED.getValue());
loginAttemptEntity.setErrorMsg(errorMsg); loginAttemptEntity.setErrorMsg(errorMsg);
loginAttemptDao.createLoginAttempt(loginAttemptEntity); loginAttemptDao.createLoginAttempt(loginAttemptEntity);
} }
public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe) { public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe, Long loginAttemptId) {
UserEntity oldUserEntity = Utils.getClonedEntityForData(user);
user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
userRepository.save(user); user = userRepository.save(user);
String token = tokenProvider.createToken(rememberMe, user); String token = tokenProvider.createToken(rememberMe, user, loginAttemptId);
log.info("JWT token generated for email: {}", user.getEmail()); log.info("JWT token generated for email: {}", user.getEmail());
RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity());
@@ -137,6 +153,9 @@ public class AuthenticationService {
JWTToken jwtToken = new JWTToken(token, loginResponse); JWTToken jwtToken = new JWTToken(token, loginResponse);
/** This code is responsible for adding a version history log for the "Create user Or Update user" operation. **/
loggingUtil.addVersionHistoryWithoutToken(VersionHistoryRequest.builder().request(request).oldData(oldUserEntity).newData(user).actionType(VersionActionTypeEnum.UPDATE).build());
log.info("Login successful for email: {}", user.getEmail()); log.info("Login successful for email: {}", user.getEmail());
return jwtToken; return jwtToken;
} }
@@ -184,8 +203,6 @@ public class AuthenticationService {
public void logout(HttpServletRequest request, HttpServletResponse response) { public void logout(HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) { if (auth != null) {
String token = tokenProvider.extractTokenFromRequest(request);
tokenProvider.invalidateToken(token);
new SecurityContextLogoutHandler().logout(request, response, auth); new SecurityContextLogoutHandler().logout(request, response, auth);
} }
SecurityContextHolder.getContext().setAuthentication(null); SecurityContextHolder.getContext().setAuthentication(null);
@@ -215,7 +232,8 @@ public class AuthenticationService {
loginReq.setEmail(userEntity.getEmail()); loginReq.setEmail(userEntity.getEmail());
loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request);
loginAttemptEntity.setUserId(userEntity.getId()); loginAttemptEntity.setUserId(userEntity.getId());
return getJWTTokenBean(userEntity, Boolean.TRUE); LoginAttemptEntity loginAttempt = createSuccessLoginAttempt(loginAttemptEntity);
return getJWTTokenBean(userEntity, Boolean.TRUE, loginAttempt.getId());
} catch (Exception e) { } catch (Exception e) {
log.info("Authentication login failed for email: {}",e.getMessage()); log.info("Authentication login failed for email: {}",e.getMessage());
loginAttemptEntity.setUserId(userId); loginAttemptEntity.setUserId(userId);

View File

@@ -63,7 +63,7 @@ public class CommunicationServiceImpl implements CommunicationService {
} }
@Override @Override
@Transactional(readOnly = true) @Transactional(rollbackFor = Exception.class)
public ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id) { public ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id) {
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id);
if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) {

View File

@@ -90,7 +90,10 @@ public class CompanyServiceImpl implements CompanyService {
public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) { public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) {
return companyDao.validateUserWithCompny(userId, companyId); return companyDao.validateUserWithCompny(userId, companyId);
} }
@Override
public UserWithCompanyEntity getUserWithCompany(Long userId, Long companyId) {
return companyDao.getUserWithCompany(userId, companyId);
}
@Override @Override
@Transactional(readOnly = true) @Transactional(readOnly = true)
public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) {
@@ -106,7 +109,7 @@ public class CompanyServiceImpl implements CompanyService {
} }
@Override @Override
@Transactional(readOnly = true) @Transactional
public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId) { public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId) {
UserEntity userEntity =validator.validateUser(request); UserEntity userEntity =validator.validateUser(request);
return delegationDao.getCompanyDelegation(userEntity, companyId); return delegationDao.getCompanyDelegation(userEntity, companyId);
@@ -114,6 +117,7 @@ public class CompanyServiceImpl implements CompanyService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteCompanyDelegation(HttpServletRequest request, Long companyId) { public void deleteCompanyDelegation(HttpServletRequest request, Long companyId) {
UserEntity userEntity = validator.validateUser(request); UserEntity userEntity = validator.validateUser(request);
delegationDao.deleteCompanyDelegation(userEntity, companyId); delegationDao.deleteCompanyDelegation(userEntity, companyId);
} }

View File

@@ -29,7 +29,6 @@ public class DocumentServiceImpl implements DocumentService {
@Override @Override
public void deleteFile(Long documentId) { public void deleteFile(Long documentId) {
documentDao.deleteFile(documentId); documentDao.deleteFile(documentId);
return ;
} }
@Override @Override

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.service.impl; package net.gepafin.tendermanagement.service.impl;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.dao.HubDao; import net.gepafin.tendermanagement.dao.HubDao;
import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.HubEntity;
import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.request.HubReq;
@@ -19,14 +20,14 @@ public class HubServiceImpl implements HubService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public HubResponseBean createHub(HubReq hubReq) { public HubResponseBean createHub(HttpServletRequest request,HubReq hubReq) {
return hubDao.createHub(hubReq); return hubDao.createHub(request,hubReq);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public HubResponseBean updateHub(Long hubId, HubReq hubReq) { public HubResponseBean updateHub(HttpServletRequest request,Long hubId, HubReq hubReq) {
return hubDao.updateHub(hubId, hubReq); return hubDao.updateHub(request,hubId, hubReq);
} }
@Override @Override
@@ -43,8 +44,8 @@ public class HubServiceImpl implements HubService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteHub(Long hubId) { public void deleteHub(HttpServletRequest request,Long hubId) {
hubDao.deleteHub(hubId); hubDao.deleteHub(request,hubId);
} }
@Override @Override

View File

@@ -7,12 +7,17 @@ import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.ObjectMetadata;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.gepafin.tendermanagement.dao.DocumentDao;
import net.gepafin.tendermanagement.dao.S3PathConfig; import net.gepafin.tendermanagement.dao.S3PathConfig;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.DocumentEntity;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository;
import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository;
import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.service.ApplicationService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -50,13 +55,35 @@ public class S3ReUploadMigrationService {
@Autowired @Autowired
private AmazonS3 amazonS3; private AmazonS3 amazonS3;
@Autowired
ApplicationService applicationService;
@Value("${aws.s3.url}") @Value("${aws.s3.url}")
private String s3Url; private String s3Url;
@Autowired
AmazonS3Service amazonS3Service;
@Value("${aws.s3.bucket.name}")
private String bucketName;
@Value("${aws.s3.region}")
private String region;
@Autowired
private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository;
@Autowired
private DocumentDao documentDao;
private boolean migrationCompleted = false; private boolean migrationCompleted = false;
public String reUploadAndMigrateDocuments(String providedKey) { public String reUploadAndMigrateDocuments(String providedKey) {
Long totalDocuments=0L;
Long failedDocuments=0L;
Long processDocuments=0L;
if (migrationCompleted) { if (migrationCompleted) {
return "Migration already completed."; return "Migration already completed.";
} }
@@ -66,26 +93,48 @@ public class S3ReUploadMigrationService {
return "Invalid or missing migration key."; return "Invalid or missing migration key.";
} }
List<DocumentEntity> documents = documentRepository.findAllByIsDeleteFalse(); List<DocumentEntity> documents = documentRepository.findAllByIsDeleteTrue();
totalDocuments = Long.valueOf(documents.size());
if (documents.isEmpty()) { if (documents.isEmpty()) {
return "No documents found to migrate."; return "No documents found to migrate.";
} }
for (DocumentEntity document : documents) { for (DocumentEntity document : documents) {
String oldUrl = document.getFilePath(); // This should contain the full URL log.info("Processing for the Document id and url:{} ",document.getId(),document.getFilePath());
log.info("Processing {}", oldUrl);
try { try {
File localFile = downloadFileFromS3(oldUrl);
String newKey = generateNewS3Path(document); // Make sure this generates the correct new path Long callId = null;
String uploadedPath = uploadFileToNewBucket(localFile, newKey); Long applicationId = null;
updateDocumentPathAndNameEntry(document, uploadedPath); Long amendmentId = null;
if (DocumentSourceTypeEnum.CALL.getValue().equalsIgnoreCase(document.getSource())) {
callId = document.getSourceId();
} else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(document.getSource())) {
applicationId = document.getSourceId();
ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId);
callId = applicationEntity.getCall().getId();
}
else if(DocumentSourceTypeEnum.AMENDMENT.getValue().equalsIgnoreCase(document.getSource())){
amendmentId = document.getSourceId();
ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
applicationId = applicationEntity.getId();
callId = applicationEntity.getCall().getId();
}
documentDao.deleteFileFromS3(document,callId,applicationId,amendmentId);
processDocuments++;
} catch (Exception e) { } catch (Exception e) {
log.error("Error processing document {}: {}", document.getId(), e.getMessage()); log.error("Error processing document {}: {}", document.getId(), e.getMessage());
failedDocuments++;
} }
} }
log.info("Total Documents Fetched ",totalDocuments);
log.info("Total Process Documents :{}",processDocuments);
log.info("Total Failed Documents :{}",failedDocuments);
return "Migrated Successfully."; return "Migrated Successfully.";
} }
private boolean isValidKey(String providedKey) { private boolean isValidKey(String providedKey) {
@@ -164,10 +213,10 @@ public class S3ReUploadMigrationService {
Long callId; Long callId;
if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { if (sourceType.equals(DocumentSourceTypeEnum.CALL)) {
return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L); return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L);
} else { } else {
callId = applicationRepository.findCallIdById(document.getSourceId()); callId = applicationRepository.findCallIdById(document.getSourceId());
return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId()); return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L);
} }
} }
@@ -177,13 +226,4 @@ public class S3ReUploadMigrationService {
return parts[parts.length - 1]; return parts[parts.length - 1];
} }
private void updateDocumentPathAndNameEntry(DocumentEntity document, String newPath) {
String fileName = extractFileName(newPath);
document.setFilePath(newPath);
document.setFileName(fileName);
documentRepository.save(document);
log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath);
}
} }

View File

@@ -4,6 +4,8 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import net.gepafin.tendermanagement.dao.UserDao; import net.gepafin.tendermanagement.dao.UserDao;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.LoginReq;
import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq;
import net.gepafin.tendermanagement.model.request.UserReq; import net.gepafin.tendermanagement.model.request.UserReq;
@@ -13,6 +15,7 @@ import net.gepafin.tendermanagement.model.response.UserSamlResponse;
import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean;
import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.model.util.JWTToken;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.util.Validator;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +34,9 @@ public class UserServiceImpl implements UserService {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {

View File

@@ -6,6 +6,7 @@ import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.ObjectMetadata;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.gepafin.tendermanagement.dao.DelegationDao;
import net.gepafin.tendermanagement.dao.S3PathConfig; import net.gepafin.tendermanagement.dao.S3PathConfig;
import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity;
import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity;
@@ -56,10 +57,16 @@ public class UserSignedAndDelegationServiceImpl {
@Value("${aws.s3.url}") @Value("${aws.s3.url}")
private String s3Url; private String s3Url;
@Autowired
private DelegationDao delegationDao;
private boolean migrationCompleted = false; private boolean migrationCompleted = false;
public String migrateUserDelegatedDocuments(String providedKey) { public String migrateUserDelegatedDocuments(String providedKey) {
Long totalDocuments=0L;
Long failedDocuments=0L;
Long processDocuments=0L;
if (migrationCompleted) { if (migrationCompleted) {
return "Migration already completed."; return "Migration already completed.";
} }
@@ -69,25 +76,27 @@ public class UserSignedAndDelegationServiceImpl {
return "Invalid or missing migration key."; return "Invalid or missing migration key.";
} }
List<UserCompanyDelegationEntity> documents = userCompanyDelegationRepository.findAllByStatus("ACTIVE"); List<UserCompanyDelegationEntity> documents = userCompanyDelegationRepository.findAllByStatus("INACTIVE");
totalDocuments = Long.valueOf(documents.size());
if (documents.isEmpty()) { if (documents.isEmpty()) {
return "No documents found to migrate."; return "No documents found to migrate.";
} }
for (UserCompanyDelegationEntity document : documents) { for (UserCompanyDelegationEntity document : documents) {
String oldUrl = document.getFilePath(); String oldUrl = document.getFilePath();
log.info("Processing user designated document: {}", oldUrl); log.info("Processing user designated document and old Url: {}", document.getId(),oldUrl);
try { try {
File localFile = downloadFileFromS3(oldUrl); delegationDao.deleteDelegationFromS3(document);
String newKey = generateNewS3PathForDelegationDoc(); processDocuments++;
String uploadedPath = uploadFileToNewBucket(localFile, newKey);
updateDelegatedDocumentPathAndNameEntry(document, uploadedPath);
} catch (Exception e) { } catch (Exception e) {
log.error("Error processing user designated document {}: {}", document.getId(), e.getMessage()); log.error("Error processing user designated document {}: {}", document.getId(), e.getMessage());
failedDocuments++;
} }
} }
log.info("Total Documents Fetched:{} ",totalDocuments);
log.info("Total Process Documents :{}",processDocuments);
log.info("Total Failed Documents :{}",failedDocuments);
return "Migrated"; return "Migrated";
} }
@@ -130,7 +139,7 @@ public class UserSignedAndDelegationServiceImpl {
private String generateNewS3PathForDelegationDoc() { private String generateNewS3PathForDelegationDoc() {
return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L);
} }
private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) {

View File

@@ -0,0 +1,45 @@
package net.gepafin.tendermanagement.util;
import jakarta.servlet.http.HttpServletRequest;
import java.util.regex.Pattern;
public class IpAddressUtils {
private static final Pattern IPV4_PATTERN = Pattern.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
private static final Pattern IPV6_PATTERN = Pattern.compile(
"([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|" + "([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|" + "([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|" + "([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|" + ":((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|" + "::(ffff(:0{1,4}){0,1}:){0,1}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3,3}" + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|([0-9a-fA-F]{1,4}:){1,4}:" + "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3,3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])");
public static String getClientIp(HttpServletRequest request) {
String ipAddress = null;
String[] headers = { "X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR" };
for (String header : headers) {
ipAddress = request.getHeader(header);
if (ipAddress != null && !ipAddress.isEmpty() && !"unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = ipAddress.split(",")[0].trim();
break;
}
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
if ("0:0:0:0:0:0:0:1".equals(ipAddress) || "127.0.0.1".equals(ipAddress)) {
ipAddress = "127.0.0.1";
}
if (isValidIpAddress(ipAddress)) {
return ipAddress;
} else {
return "Invalid IP";
}
}
private static boolean isValidIpAddress(String ipAddress) {
return IPV4_PATTERN.matcher(ipAddress).matches() || IPV6_PATTERN.matcher(ipAddress).matches();
}
}

View File

@@ -0,0 +1,333 @@
package net.gepafin.tendermanagement.util;
import io.jsonwebtoken.Claims;
import jakarta.persistence.Table;
import lombok.extern.slf4j.Slf4j;
import net.gepafin.tendermanagement.config.CachedBodyHttpServletRequest;
import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.UserActionEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.entities.VersionHistoryEntity;
import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.UserActionsRepository;
import net.gepafin.tendermanagement.repositories.VersionHistoryRepository;
import net.gepafin.tendermanagement.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
@RequestScope
public class LoggingUtil {
@Autowired
private UserActionsRepository userActionsRepository;
@Autowired
private VersionHistoryRepository versionHistoryRepository;
@Autowired
private UserService userService;
@Autowired
private TokenProvider tokenProvider;
public UserActionEntity logUserAction(UserActionRequest userActionRequest) {
UserActionEntity userAction = new UserActionEntity();
try {
String token = tokenProvider.extractTokenFromRequest(userActionRequest.getRequest());
Claims claims = tokenProvider.getClaimsFromToken(token);
Map<String, String[]> parameters = userActionRequest.getRequest().getParameterMap();
parameters.forEach((key, value) -> log.info("Query Parameter: {} = {}", key, Arrays.toString(value)));
Long userId = claims.get(GepafinConstant.USER_ID, Long.class);
Long loginAttemptId = claims.get(GepafinConstant.LOGIN_ATTEMPT_ID, Long.class);
UserEntity userEntity = userService.validateUser(userId);
String requestBody = null;
if (userActionRequest.getRequest() instanceof CachedBodyHttpServletRequest cachedRequest) {
requestBody = cachedRequest.getCachedBodyAsString();
}
// Decode the raw URI to handle encoded placeholders like %7BcommentId%7D
String rawUrl = userActionRequest.getRequest().getRequestURI();
String decodedUrl = URLDecoder.decode(rawUrl, StandardCharsets.UTF_8);
// Append query parameters if they exist
if (userActionRequest.getRequest().getQueryString() != null) {
decodedUrl += "?" + userActionRequest.getRequest().getQueryString();
}
// Use the decoded URL as-is (optional normalization step if needed)
String normalizedUrl = normalizeUrl(decodedUrl);
// Set the normalized URL in the user action log
userAction.setActionType(userActionRequest.getActionType().getValue());
userAction.setUserId(userId);
userAction.setActionContext(userActionRequest.getActionContext().getValue());
userAction.setMethodType(userActionRequest.getRequest().getMethod());
userAction.setHubId(userEntity.getHub().getId());
// userAction.setUrl(userActionRequest.getRequest().getRequestURI());
userAction.setUrl(normalizedUrl);
userAction.setLoginAttemptId(loginAttemptId);
userAction.setIpAddress(IpAddressUtils.getClientIp(userActionRequest.getRequest()));
userAction.setRequestBody(requestBody);
String response = Utils.convertEntityToJsonForLogging(userActionRequest.getResponse());
userAction.setResponse(response);
userActionsRepository.save(userAction);
userActionRequest.getRequest().setAttribute(GepafinConstant.USER_ACTION_ID, userAction.getId());
} catch (Exception e) {
log.error("Error logging user action: {}", e.getMessage(), e);
}
return userAction;
}
private String normalizeUrl(String url) {
url = url.replaceAll("(?<!:)//+", "/");
if (url.length() > 1 && url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
url = URLDecoder.decode(url, StandardCharsets.UTF_8);
return url;
}
// @Transactional
// public UserActionEntity updateUserAction(HttpServletResponse response, UserActionEntity userAction) {
// try {
// String requestBody = null;
// if (userAction. instanceof CachedBodyHttpServletRequest cachedRequest) {
// requestBody = cachedRequest.getCachedBodyAsString();
// }
//
// LogResponse<String> logResponse = new LogResponse<>();
// logResponse.setStatus(response.getStatus());
// logResponse.setStatusCode(String.valueOf(response.getStatus()));
// logResponse.setMessage("SUCCESS");
//
// String serializedResponse;
// try {
// ObjectMapper objectMapper = new ObjectMapper();
// serializedResponse = objectMapper.writeValueAsString(logResponse);
// } catch (Exception e) {
// serializedResponse = "Error serializing LogResponse: " + e.getMessage();
// }
//
// userAction.setResponse(serializedResponse);
// userActionsRepository.save(userAction);
// } catch (Exception e) {
// log.error("Error updating user action: {}", e.getMessage(), e);
// }
// return userAction;
// }
public void logVersionHistory(VersionHistoryRequest versionHistoryRequest, Long recordId, Long userActionId, String tableName) {
try {
VersionHistoryEntity history = new VersionHistoryEntity();
String token = tokenProvider.extractTokenFromRequest(versionHistoryRequest.getRequest());
if(versionHistoryRequest.getRequest() != null && token != null)
{
Claims claims = tokenProvider.getClaimsFromToken(token);
Long userId = claims.get(GepafinConstant.USER_ID, Long.class);
history.setUserId(userId);
}
String oldData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getOldData());
String newData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getNewData());
history.setUserActionId(userActionId);
history.setActionType(versionHistoryRequest.getActionType().getValue());
history.setOldData(oldData);
history.setNewData(newData);
history.setRecordId(recordId);
history.setTableName(tableName);
versionHistoryRepository.save(history);
} catch (Exception e) {
log.error("Error logging version history: {}", e.getMessage(), e);
}
}
public void logVersionHistoryWithoutToken(VersionHistoryRequest versionHistoryRequest, Long recordId, Long userActionId, String tableName) {
try {
VersionHistoryEntity history = new VersionHistoryEntity();
Long userId = null;
String token = tokenProvider.extractTokenFromRequest(versionHistoryRequest.getRequest());
if(versionHistoryRequest.getRequest() != null && token != null)
{
Claims claims = tokenProvider.getClaimsFromToken(token);
userId = claims.get(GepafinConstant.USER_ID, Long.class);
}
String oldData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getOldData());
String newData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getNewData());
history.setUserActionId(userActionId);
history.setActionType(versionHistoryRequest.getActionType().getValue());
history.setOldData(oldData);
history.setNewData(newData);
history.setRecordId(recordId);
history.setTableName(tableName);
history.setUserId(userId);
versionHistoryRepository.save(history);
} catch (Exception e) {
log.error("Error logging version history: {}", e.getMessage(), e);
}
}
public String getTableName(Class<?> entityClass) {
try {
if (entityClass.isAnnotationPresent(Table.class)) {
Table tableAnnotation = entityClass.getAnnotation(Table.class);
return tableAnnotation.name();
}
} catch (Exception e) {
log.error("Error retrieving table name: {}", e.getMessage(), e);
}
return null;
}
public void addVersionHistory(VersionHistoryRequest versionHistoryRequest) {
try {
Long userActionId = (Long) versionHistoryRequest.getRequest().getAttribute(GepafinConstant.USER_ACTION_ID);
Long recordId = null;
String tableName = null;
if(versionHistoryRequest.getNewData() != null) {
recordId = versionHistoryRequest.getNewData().getId();
tableName = getTableName(versionHistoryRequest.getNewData().getClass()).toUpperCase();
} else if(versionHistoryRequest.getOldData() != null){
recordId = versionHistoryRequest.getOldData().getId();
tableName = getTableName(versionHistoryRequest.getOldData().getClass()).toUpperCase();
}
logVersionHistory(versionHistoryRequest, recordId, userActionId, tableName);
} catch (Exception e) {
log.error("Error adding version history: {}", e.getMessage(), e);
}
}
public void addVersionHistoryWithoutToken(VersionHistoryRequest versionHistoryRequest) {
try {
Long userActionId = (Long) versionHistoryRequest.getRequest().getAttribute(GepafinConstant.USER_ACTION_ID);
Long recordId = null;
String tableName = null;
if(versionHistoryRequest.getNewData() != null) {
recordId = versionHistoryRequest.getNewData().getId();
tableName = getTableName(versionHistoryRequest.getNewData().getClass()).toUpperCase();
} else if(versionHistoryRequest.getOldData() != null){
recordId = versionHistoryRequest.getOldData().getId();
tableName = getTableName(versionHistoryRequest.getOldData().getClass()).toUpperCase();
}
versionHistoryRequest.setNewData(versionHistoryRequest.getNewData());
versionHistoryRequest.setRequest(versionHistoryRequest.getRequest());
logVersionHistoryWithoutToken(versionHistoryRequest, recordId, userActionId, tableName);
} catch (Exception e) {
log.error("Error adding version history: {}", e.getMessage(), e);
}
}
public UserActionEntity logUserActionWithoutToken(UserActionRequest userActionRequest) {
UserActionEntity userAction = new UserActionEntity();
try {
Long userId = null;
Long loginAttemptId = null;
Long hubId = null;
String token = tokenProvider.extractTokenFromRequest(userActionRequest.getRequest());
Map<String, String[]> parameters = userActionRequest.getRequest().getParameterMap();
parameters.forEach((key, value) -> log.info("Query Parameter : {} = {}", key, Arrays.toString(value)));
if(userActionRequest.getRequest() != null && token != null)
{
Claims claims = tokenProvider.getClaimsFromToken(token);
userId = claims.get(GepafinConstant.USER_ID, Long.class);
loginAttemptId = claims.get(GepafinConstant.LOGIN_ATTEMPT_ID, Long.class);
UserEntity userEntity = userService.validateUser(userId);
hubId = userEntity.getHub().getId();
}
String requestBody = null;
if (userActionRequest.getRequest() instanceof CachedBodyHttpServletRequest cachedRequest) {
requestBody = cachedRequest.getCachedBodyAsString();
}
userAction.setActionType(userActionRequest.getActionType().getValue());
userAction.setUserId(userId);
userAction.setActionContext(userActionRequest.getActionContext().getValue());
userAction.setMethodType(userActionRequest.getRequest().getMethod());
userAction.setHubId(hubId);
userAction.setUrl(userActionRequest.getRequest().getRequestURI());
userAction.setLoginAttemptId(loginAttemptId);
userAction.setIpAddress(IpAddressUtils.getClientIp(userActionRequest.getRequest()));
userAction.setRequestBody(requestBody);
String response = Utils.convertEntityToJsonForLogging(userActionRequest.getResponse());
userAction.setResponse(response);
userActionsRepository.save(userAction);
userActionRequest.getRequest().setAttribute(GepafinConstant.USER_ACTION_ID, userAction.getId());
} catch (Exception e) {
log.error("Error logging user action: {}", e.getMessage(), e);
}
return userAction;
}
public void updateUserActionWithTokenDetails(Long actionId, String token, Object response) {
try {
UserActionEntity userAction = getUserActionLogById(actionId);
if (userAction != null && token != null) {
Claims claims = tokenProvider.getClaimsFromToken(token);
Long userId = claims.get(GepafinConstant.USER_ID, Long.class);
Long loginAttemptId = claims.get(GepafinConstant.LOGIN_ATTEMPT_ID, Long.class);
UserEntity userEntity = userService.validateUser(userId);
userAction.setUserId(userId);
String responseData = Utils.convertEntityToJsonForLogging(response);
userAction.setResponse(responseData);
userAction.setLoginAttemptId(loginAttemptId);
userAction.setHubId(userEntity.getHub().getId());
// Save updated entity
userActionsRepository.save(userAction);
log.info("User action log updated with token details: {}", userAction.getId());
}
} catch (Exception e) {
log.error("Failed to update user action with token details: {}", e.getMessage(), e);
}
}
public void updateVersionHistoriesWithTokenDetails(Long userActionId, String token) {
try {
// Fetch version history entities for the given user action ID
List<VersionHistoryEntity> versionHistoryEntities = getVersionHistoryLogById(userActionId);
if (versionHistoryEntities != null && !versionHistoryEntities.isEmpty() && token != null) {
// Extract claims from the token
Claims claims = tokenProvider.getClaimsFromToken(token);
Long userId = claims.get(GepafinConstant.USER_ID, Long.class);
// Update each version history entity with the user ID
for (VersionHistoryEntity versionHistoryEntity : versionHistoryEntities) {
versionHistoryEntity.setUserId(userId);
}
// Save all updated entities
versionHistoryRepository.saveAll(versionHistoryEntities);
log.info("Version History logs updated with userId: {}", userId);
} else {
log.warn("No version history or token provided for userActionId: {}", userActionId);
}
} catch (Exception e) {
log.error("Failed to update version histories with token details: {}", e.getMessage(), e);
}
}
public UserActionEntity getUserActionLogById(Long id) {
return userActionsRepository.findUserActionById(id);
}
public List<VersionHistoryEntity> getVersionHistoryLogById(Long id) {
return versionHistoryRepository.findVersionHistoryByUserActionId(id);
}
}

View File

@@ -5,20 +5,24 @@ import java.lang.reflect.Field;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*; import java.util.*;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.itextpdf.styledxmlparser.jsoup.Jsoup; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
@@ -42,6 +46,9 @@ 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.FeignClientUnauthorizedException;
import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.IvParameterSpec;
@@ -54,9 +61,8 @@ public class Utils {
public static final Logger log = LoggerFactory.getLogger(Utils.class); public static final Logger log = LoggerFactory.getLogger(Utils.class);
private static final ObjectMapper mapper = new ObjectMapper() private static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(new JavaTimeModule()) .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
public static <T, U> U convertObject(T source, Class<U> destinationClass) { public static <T, U> U convertObject(T source, Class<U> destinationClass) {
try { try {
@@ -517,7 +523,61 @@ public class Utils {
} }
return null; return null;
} }
public static <T> String listToCommaSeparatedString(List<T> list) { public static <T> String listToCommaSeparatedString(List<T> list) {
return String.join(", ", list.stream().map(String::valueOf).toList()); return String.join(", ", list.stream().map(String::valueOf).toList());
} }
public static String convertEntityToJsonForLogging(Object entity) {
if (entity == null) {
return null;
}
try {
JsonNode entityNode = mapper.valueToTree(entity);
ObjectNode objectNode = (ObjectNode) entityNode;
Field[] fields = entity.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(ManyToOne.class) || field.isAnnotationPresent(OneToMany.class) || field.isAnnotationPresent(
OneToOne.class) || field.isAnnotationPresent(ManyToMany.class)) {
objectNode.remove(field.getName());
}
}
return mapper.writeValueAsString(objectNode);
} catch (JsonProcessingException e) {
log.error("Failed to parse entity in json {}", e.getMessage());
return null;
}
}
public static <T> T getClonedEntityForData(T entity) {
if (entity == null) {
return null;
}
try {
String json = mapper.writeValueAsString(entity);
@SuppressWarnings("unchecked") T clonedEntity = (T) mapper.readValue(json, entity.getClass());
return clonedEntity;
} catch (Exception e) {
log.error("Failed to clone entity {}", e.getMessage());
return null;
}
}
public static void setHttpServletRequestForScheduler() {
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.setRequestURI("/scheduled");
mockRequest.setMethod("POST");
ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest);
RequestContextHolder.setRequestAttributes(attributes);
}
public static void clearHttpServletRequest() {
// Clear the RequestContextHolder after task execution
RequestContextHolder.resetRequestAttributes();
}
} }

View File

@@ -5,9 +5,10 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.validation.Valid;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants;
import org.springframework.data.repository.query.Param;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
@@ -16,7 +17,7 @@ import org.springframework.web.bind.annotation.PutMapping;
@Validated @Validated
public interface S3MigrationApi { public interface S3MigrationApi {
@Operation(summary = "Api to migrate S3 doc to db and update s3 files as per specified folder.", responses = { @ApiResponse(responseCode = "200", description = "OK"), @Operation(summary = "Api to migrate deleted documents to the deleted Folder ", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -24,5 +25,5 @@ public interface S3MigrationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@PutMapping(value = "/{key}", produces = { "application/json" }) @PutMapping(value = "/{key}", produces = { "application/json" })
String reUploadAndMigrateDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); String reUploadAndMigrateDocuments(HttpServletRequest request, @Parameter(description = "The secret key", required = true) @PathVariable("key") String key);
} }

View File

@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
@@ -16,7 +17,7 @@ import org.springframework.web.bind.annotation.PostMapping;
@Validated @Validated
public interface UserSignedAndDelegationApi { public interface UserSignedAndDelegationApi {
@Operation(summary = "Api to migrate S3 doc to db and user-delegated folder", responses = { @ApiResponse(responseCode = "200", description = "OK"), @Operation(summary = "Api to migrate S3 user-delegated deleted doc to deleted folder", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -24,7 +25,7 @@ public interface UserSignedAndDelegationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@GetMapping(value = "/{key}", produces = { "application/json" }) @GetMapping(value = "/{key}", produces = { "application/json" })
String migrateUserDelegatedDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); String migrateUserDelegatedDocuments(HttpServletRequest request, @Parameter(description = "The secret key", required = true) @PathVariable("key") String key);
@Operation(summary = "Api to migrate S3 doc to user-signed.", responses = { @ApiResponse(responseCode = "200", description = "OK"), @Operation(summary = "Api to migrate S3 doc to user-signed.", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {

View File

@@ -5,13 +5,16 @@ import lombok.extern.log4j.Log4j2;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest;
import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean;
import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.ApplicationAmendmentRequestApi; import net.gepafin.tendermanagement.web.rest.api.ApplicationAmendmentRequestApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -29,8 +32,16 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Autowired @Autowired
ApplicationAmendmentRequestService applicationAmendmentRequestService; ApplicationAmendmentRequestService applicationAmendmentRequestService;
@Autowired
LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) {
/** This code is responsible for creating user action logs for the "get application data for amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_APPLICATION_DATA_FOR_AMENDMENT).build());
ApplicationAmendmentRequestResponse applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationEvaluationId); ApplicationAmendmentRequestResponse applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationEvaluationId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG)));
@@ -38,6 +49,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest) { public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest) {
/** This code is responsible for creating user action logs for the "Create Application Amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT)
.actionContext(UserActionContextEnum.CREATE_AMENDMENT).build());
ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.createApplicationAmendmentRequest(request,applicationEvaluationId,applicationAmendmentRequest); ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.createApplicationAmendmentRequest(request,applicationEvaluationId,applicationAmendmentRequest);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.CREATE_APPLICATION_DATA_FOR_AMENDMENT_MSG))); .body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.CREATE_APPLICATION_DATA_FOR_AMENDMENT_MSG)));
@@ -46,6 +62,10 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<Void>> deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { public ResponseEntity<Response<Void>> deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) {
log.info("Delete Application Amendment Request- Application Amendment ID: {}", id); log.info("Delete Application Amendment Request- Application Amendment ID: {}", id);
/** This code is responsible for creating user action logs for the "Delete Amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_AMENDMENT).build());
applicationAmendmentRequestService.deleteApplicationAmendmentRequest(request,id); applicationAmendmentRequestService.deleteApplicationAmendmentRequest(request,id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_AMENDMENT_SUCCESS_MSG)));
@@ -54,6 +74,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> getApplicationAmendmentRequestById(HttpServletRequest request,Long id) {
log.info("Get Application Amendment Request By Id"); log.info("Get Application Amendment Request By Id");
/** This code is responsible for creating user action logs for the "get application amendment by id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_AMENDMENT).build());
ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.getApplicationAmendmentRequestById(request,id); ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.getApplicationAmendmentRequestById(request,id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG)));
@@ -62,6 +87,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) {
log.info("Get All Applications Amendment Request"); log.info("Get All Applications Amendment Request");
/** This code is responsible for creating user action logs for the "get all application amendment by preInstructor user id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_ALL_AMENDMENT_BY_PREINSTRUCTOR_USER_ID).build());
List<ApplicationAmendmentRequestResponse> applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request,userId); List<ApplicationAmendmentRequestResponse> applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request,userId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationAmendmentRequestResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(applicationAmendmentRequestResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG)));
@@ -70,15 +100,25 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) {
log.info("Update Application Amendment"); log.info("Update Application Amendment");
/** This code is responsible for "Updating Amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_AMENDMENT).build());
ApplicationAmendmentRequestResponse updateApplicationAmendment = applicationAmendmentRequestService.updateApplicationAmendment(request, id, applicationAmendmentRequestBean); ApplicationAmendmentRequestResponse updateApplicationAmendment = applicationAmendmentRequestService.updateApplicationAmendment(request, id, applicationAmendmentRequestBean);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(updateApplicationAmendment, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); .body(new Response<>(updateApplicationAmendment, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG)));
} }
@Override @Override
public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryUserId) { public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) {
log.info("Get All Application Amendment Request By Beneficiary ID"); log.info("Get All Application Amendment Request By Beneficiary ID");
List<ApplicationAmendmentRequestResponse> applicationAmendmentRequestResponseList = applicationAmendmentRequestService.getAllAmendmentRequestByBeneficiaryId(request, beneficiaryUserId);
/** This code is responsible for creating user action logs for the "get all application amendment by beneficiary user id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_ALL_AMENDMENT_BY_BENEFICIARY_USER_ID).build());
List<ApplicationAmendmentRequestResponse> applicationAmendmentRequestResponseList = applicationAmendmentRequestService.getAllAmendmentRequestByBeneficiaryId(request, beneficiaryId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG)));
} }
@@ -86,6 +126,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> closeApplicationAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> closeApplicationAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) {
log.info("Closing Amendment Request"); log.info("Closing Amendment Request");
/** This code is responsible for "Close Amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.CLOSE_AMENDMENT).build());
ApplicationAmendmentRequestResponse amendmentRequestResponse = applicationAmendmentRequestService.closeAmendmentRequest(request, id,closeAmendmentRequest); ApplicationAmendmentRequestResponse amendmentRequestResponse = applicationAmendmentRequestService.closeAmendmentRequest(request, id,closeAmendmentRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(amendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_CLOSED_SUCCESFULLY))); .body(new Response<>(amendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_CLOSED_SUCCESFULLY)));
@@ -99,6 +144,10 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
log.info("Extending response days for Amendment Request ID: {}", id); log.info("Extending response days for Amendment Request ID: {}", id);
/** This code is responsible for "Extend Response Days for Amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.EXTEND_RESPONSE_DAYS_FOR_AMENDMENT).build());
ApplicationAmendmentRequestResponse response = applicationAmendmentRequestService.extendResponseDays(request, id, addedDays); ApplicationAmendmentRequestResponse response = applicationAmendmentRequestService.extendResponseDays(request, id, addedDays);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -106,6 +155,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
} }
@Override @Override
public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List<ApplicationAmendmentRequestEnum> statuses) { public ResponseEntity<Response<List<ApplicationAmendmentRequestResponse>>> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List<ApplicationAmendmentRequestEnum> statuses) {
/** This code is responsible for creating user action logs for the "get all application amendment by application id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_AMENDMENT_BY_APPLICATION_ID).build());
List<ApplicationAmendmentRequestResponse> applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId,statuses); List<ApplicationAmendmentRequestResponse> applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId,statuses);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG)));
@@ -113,6 +167,10 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, public ResponseEntity<Response<ApplicationAmendmentRequestResponse>> updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId,
ApplicationAmendmentRequestEnum status) { ApplicationAmendmentRequestEnum status) {
/** This code is responsible for "Updating Amendment Status" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_AMENDMENT_STATUS).build());
ApplicationAmendmentRequestResponse applicationResponse = applicationAmendmentRequestService.updateApplicationAmendmentStatus(request, applicationAmendmentId, status); ApplicationAmendmentRequestResponse applicationResponse = applicationAmendmentRequestService.updateApplicationAmendmentStatus(request, applicationAmendmentId, status);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG)));

View File

@@ -3,10 +3,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.enums.FormActionEnum;
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean;
import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponse;
import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; import net.gepafin.tendermanagement.model.response.ApplicationResponseBean;
@@ -15,6 +18,7 @@ import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.PdfService; import net.gepafin.tendermanagement.service.PdfService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.ApplicationApi; import net.gepafin.tendermanagement.web.rest.api.ApplicationApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -43,9 +47,19 @@ public class ApplicationApiController implements ApplicationApi {
@Autowired @Autowired
private PdfService pdfService; private PdfService pdfService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<ApplicationResponseBean>> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long applicationId, Long formId) { public ResponseEntity<Response<ApplicationResponseBean>> createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long applicationId,
Long formId) {
/** This code is responsible for creating user action logs for the "Create or update application form" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_FORM).build());
ApplicationResponseBean applicationResponseBean = applicationService.createApplication(request, applicationRequestBean, applicationId, formId); ApplicationResponseBean applicationResponseBean = applicationService.createApplication(request, applicationRequestBean, applicationId, formId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG)));
} }
@@ -54,38 +68,63 @@ public class ApplicationApiController implements ApplicationApi {
public ResponseEntity<Response<ApplicationGetResponseBean>> getApplicationByFormId(HttpServletRequest request public ResponseEntity<Response<ApplicationGetResponseBean>> getApplicationByFormId(HttpServletRequest request
, Long applicationId, Long formId) { , Long applicationId, Long formId) {
log.info("Get Application by ID - Application ID: {}", applicationId); log.info("Get Application by ID - Application ID: {}", applicationId);
/** This code is responsible for creating user action logs for the "Get Application" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION).build());
ApplicationGetResponseBean application = applicationService.getApplicationByFormId(request, applicationId, formId); ApplicationGetResponseBean application = applicationService.getApplicationByFormId(request, applicationId, formId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<Void>> deleteApplication(HttpServletRequest request, public ResponseEntity<Response<Void>> deleteApplication(HttpServletRequest request, Long applicationId) {
Long applicationId) {
log.info("Delete Application - Application ID: {}", applicationId); log.info("Delete Application - Application ID: {}", applicationId);
/** This code is responsible for creating user action logs for the "Delete Application" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_APPLICATION).build());
applicationService.deleteApplication(request, applicationId); applicationService.deleteApplication(request, applicationId);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_SUCCESS_MSG))); return ResponseEntity.status(HttpStatus.OK).body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<ApplicationResponse>> createApplicationByCallId(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { public ResponseEntity<Response<ApplicationResponse>> createApplicationByCallId(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) {
/** This code is responsible for creating user action logs for the "Create application" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_APPLICATION).build());
ApplicationResponse applicationResponseBean = applicationService.createApplication(request, companyId, applicationRequest, callId); ApplicationResponse applicationResponseBean = applicationService.createApplication(request, companyId, applicationRequest, callId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<List<ApplicationResponse>>> getAllApplications(HttpServletRequest request, Long callId, Long companyId, List<ApplicationStatusTypeEnum> statusList) { public ResponseEntity<Response<List<ApplicationResponse>>> getAllApplications(HttpServletRequest request, Long callId, Long companyId,
List<ApplicationStatusTypeEnum> statusList) {
/** This code is responsible for creating user action logs for the "Get application" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_APPLICATION).build());
List<ApplicationResponse> applications = applicationService.getAllApplications(request, callId, companyId, statusList); List<ApplicationResponse> applications = applicationService.getAllApplications(request, callId, companyId, statusList);
log.info("Get All Applications"); log.info("Get All Applications");
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); return ResponseEntity.status(HttpStatus.OK).body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<NextOrPreviousFormResponse>> getNextOrPreviousForm(HttpServletRequest request, Long applicationId, public ResponseEntity<Response<NextOrPreviousFormResponse>> getNextOrPreviousForm(HttpServletRequest request, Long applicationId,
Long formId, FormActionEnum action) { Long formId, FormActionEnum action) {
/** This code is responsible for creating user action logs for the "get next or previous form" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_NEXT_PREVIOUS_FORM).build());
NextOrPreviousFormResponse data = applicationService.getNextOrPreviousForm(request, applicationId, formId, action); NextOrPreviousFormResponse data = applicationService.getNextOrPreviousForm(request, applicationId, formId, action);
log.info("Get Next Or Previous Form "); log.info("Get Next Or Previous Form ");
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -93,15 +132,24 @@ public class ApplicationApiController implements ApplicationApi {
} }
@Override @Override
public ResponseEntity<Response<ApplicationResponse>> updateApplicationStatus(HttpServletRequest request, Long applicationId, public ResponseEntity<Response<ApplicationResponse>> updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
ApplicationStatusTypeEnum status) {
/** This code is responsible for creating user action logs for the "update application status" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_APPLICATION_STATUS).build());
ApplicationResponse applicationResponse = applicationService.updateApplicationStatus(request, applicationId, status); ApplicationResponse applicationResponse = applicationService.updateApplicationStatus(request, applicationId, status);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY)));
} }
@Override @Override
public ResponseEntity<byte[]> generateApplicationPdf(HttpServletRequest request, Long applicationId) { public ResponseEntity<byte[]> generateApplicationPdf(HttpServletRequest request, Long applicationId) {
/** This code is responsible for creating user action logs for the "Generate pdf for application" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD).actionContext(UserActionContextEnum.DOWNLOAD_PDF).build());
byte[] pdfBytes = pdfService.generatePdf(request, applicationId); byte[] pdfBytes = pdfService.generatePdf(request, applicationId);
// Prepare headers for downloading the PDF // Prepare headers for downloading the PDF
@@ -116,21 +164,29 @@ public class ApplicationApiController implements ApplicationApi {
} }
@Override @Override
public ResponseEntity<Response<ApplicationSignedDocumentResponse>> uploadSignedDocument(HttpServletRequest request, public ResponseEntity<Response<ApplicationSignedDocumentResponse>> uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file) {
Long applicationId, MultipartFile file) {
log.info("upload signed document applicationId: {}", applicationId); log.info("upload signed document applicationId: {}", applicationId);
/** This code is responsible for creating user action logs for the "Upload signed document" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.UPLOAD_SIGNED_DOCUMENT).build());
ApplicationSignedDocumentResponse response = applicationService.uploadSignedDocument(request, applicationId, file); ApplicationSignedDocumentResponse response = applicationService.uploadSignedDocument(request, applicationId, file);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK).body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS)));
.body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS)));
} }
@Override @Override
public ResponseEntity<Response<ApplicationSignedDocumentResponse>> getSignedDocument(HttpServletRequest request, public ResponseEntity<Response<ApplicationSignedDocumentResponse>> getSignedDocument(HttpServletRequest request, Long applicationId) {
Long applicationId) {
/** This code is responsible for creating user action logs for the "Get signed document" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_SIGNED_DOCUMENT).build());
ApplicationSignedDocumentResponse response = applicationService.getSignedDocument(request, applicationId); ApplicationSignedDocumentResponse response = applicationService.getSignedDocument(request, applicationId);
log.info("get signed document applicationId: {}", applicationId); log.info("get signed document applicationId: {}", applicationId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK).body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_SIGNED_DOCUMENT_FILE_SUCCESS)));
.body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_SIGNED_DOCUMENT_FILE_SUCCESS)));
} }
// @Override // @Override
@@ -144,12 +200,20 @@ public class ApplicationApiController implements ApplicationApi {
@Override @Override
public ResponseEntity<Response<ApplicationResponse>> validateApplication(HttpServletRequest request, Long applicationId) { public ResponseEntity<Response<ApplicationResponse>> validateApplication(HttpServletRequest request, Long applicationId) {
/** This code is responsible for creating user action logs for the "validate application" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.VALIDATE_APPLICATION).build());
ApplicationResponse applicationResponse = applicationService.validateApplication(request, applicationId); ApplicationResponse applicationResponse = applicationService.validateApplication(request, applicationId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY)));
} }
@Override @Override
public ResponseEntity<byte[]> downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { public ResponseEntity<byte[]> downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) {
/** This code is responsible for creating user action logs for the "download application document as zip" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD).actionContext(UserActionContextEnum.DOWNLOAD_APPLICATION_DOC_ZIP).build());
byte[] zipFile = applicationService.downloadApplicationDocumentsAsZip(request, applicationId); byte[] zipFile = applicationService.downloadApplicationDocumentsAsZip(request, applicationId);
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();

View File

@@ -4,10 +4,14 @@ import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.ApplicationEvaluationService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.ApplicationEvaluationApi; import net.gepafin.tendermanagement.web.rest.api.ApplicationEvaluationApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -23,12 +27,20 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation
@Autowired @Autowired
private ApplicationEvaluationService applicationEvaluationService; private ApplicationEvaluationService applicationEvaluationService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<ApplicationEvaluationResponse>> createOrUpdateApplicationEvaluation( public ResponseEntity<Response<ApplicationEvaluationResponse>> createOrUpdateApplicationEvaluation(
HttpServletRequest request, HttpServletRequest request,
Long assignedApplicationsId, Long assignedApplicationsId,
ApplicationEvaluationRequest evaluationRequest) { ApplicationEvaluationRequest evaluationRequest) {
/** This code is responsible for creating user action logs for the "Create or update Application Evaluation" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_EVALUATION).build());
ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation( ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation(
request, evaluationRequest, assignedApplicationsId); request, evaluationRequest, assignedApplicationsId);
@@ -41,6 +53,11 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation
public ResponseEntity<Response<ApplicationEvaluationResponse>> getApplicationEvaluationByApplicationId( public ResponseEntity<Response<ApplicationEvaluationResponse>> getApplicationEvaluationByApplicationId(
HttpServletRequest request, Long applicationId, Long assignedApplicationId) { HttpServletRequest request, Long applicationId, Long assignedApplicationId) {
/** This code is responsible for creating user action logs for the "Get Application Evaluation" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION_EVALUATION).build());
ApplicationEvaluationResponse response = null; ApplicationEvaluationResponse response = null;
response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId); response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -51,6 +68,13 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation
@Override @Override
public ResponseEntity<Response<Void>> deleteApplicationEvaluation(HttpServletRequest request, public ResponseEntity<Response<Void>> deleteApplicationEvaluation(HttpServletRequest request,
Long id) { Long id) {
/** This code is responsible for creating user action logs for the "Delete Application Evaluation" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_APPLICATION_EVALUATION).build());
applicationEvaluationService.deleteApplicationEvaluation(request, id); applicationEvaluationService.deleteApplicationEvaluation(request, id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY)));

View File

@@ -4,10 +4,14 @@ import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.service.AssignedApplicationsService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.AssignedApplicationsApi; import net.gepafin.tendermanagement.web.rest.api.AssignedApplicationsApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -25,10 +29,15 @@ public class AssignedApplicationsController implements AssignedApplicationsApi {
@Autowired @Autowired
AssignedApplicationsService assignedApplicationsService; AssignedApplicationsService assignedApplicationsService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<AssignedApplicationsResponse>> createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { public ResponseEntity<Response<AssignedApplicationsResponse>> createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) {
log.info("Assigning Application To PreInstructor"); log.info("Assigning Application To PreInstructor");
/** This code is responsible for creating user action logs for the "Create Assigned Applications" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT)
.actionContext(UserActionContextEnum.CREATE_ASSIGNED_APPLICATION).build());
AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request, applicationId, userId, assignedApplicationsRequest); AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request, applicationId, userId, assignedApplicationsRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(responseData, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_ASSIGNED))); .body(new Response<>(responseData, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_ASSIGNED)));
@@ -37,6 +46,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi {
@Override @Override
public ResponseEntity<Response<Void>> deleteAssignedApplication(HttpServletRequest request, Long id) { public ResponseEntity<Response<Void>> deleteAssignedApplication(HttpServletRequest request, Long id) {
log.info("Delete Assigned Application - Assigned Application ID: {}", id); log.info("Delete Assigned Application - Assigned Application ID: {}", id);
/** This code is responsible for creating user action logs for the "Delete Assigned Applications" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_ASSIGNED_APPLICATION).build());
assignedApplicationsService.deleteApplication(request, id); assignedApplicationsService.deleteApplication(request, id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG)));
@@ -45,6 +57,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi {
@Override @Override
public ResponseEntity<Response<List<AssignedApplicationsResponse>>> getAllAssignedApplications(HttpServletRequest request, Long userId) { public ResponseEntity<Response<List<AssignedApplicationsResponse>>> getAllAssignedApplications(HttpServletRequest request, Long userId) {
log.info("Get All Assigned Applications"); log.info("Get All Assigned Applications");
/** This code is responsible for creating user action logs for the "get Assigned Applications" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_ASSIGNED_APPLICATION).build());
List<AssignedApplicationsResponse> applications = assignedApplicationsService.getAllAssignedApplications(request, userId); List<AssignedApplicationsResponse> applications = assignedApplicationsService.getAllAssignedApplications(request, userId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG)));
@@ -53,6 +68,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi {
@Override @Override
public ResponseEntity<Response<AssignedApplicationsResponse>> updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updateAssignedApplicationRequest) { public ResponseEntity<Response<AssignedApplicationsResponse>> updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updateAssignedApplicationRequest) {
log.info("Update Assigned Application"); log.info("Update Assigned Application");
/** This code is responsible for "Updating Assigned Applications details" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_ASSIGNED_APPLICATION_DETAILS).build());
AssignedApplicationsResponse updateAssignedApplication = assignedApplicationsService.updateAssignedApplication(request, id, updateAssignedApplicationRequest); AssignedApplicationsResponse updateAssignedApplication = assignedApplicationsService.updateAssignedApplication(request, id, updateAssignedApplicationRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(updateAssignedApplication, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG))); .body(new Response<>(updateAssignedApplication, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG)));
@@ -61,6 +79,10 @@ public class AssignedApplicationsController implements AssignedApplicationsApi {
@Override @Override
public ResponseEntity<Response<AssignedApplicationsResponse>> getAssignedApplicationById(HttpServletRequest request, Long id) { public ResponseEntity<Response<AssignedApplicationsResponse>> getAssignedApplicationById(HttpServletRequest request, Long id) {
log.info("Get Assigned Applications By Id"); log.info("Get Assigned Applications By Id");
/** This code is responsible for creating user action logs for the "get Assigned Applications by id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_ASSIGNED_APPLICATION).build());
AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(request, id); AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(request, id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG)));

View File

@@ -4,11 +4,15 @@ import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.BeneficiaryPreferredCallService; import net.gepafin.tendermanagement.service.BeneficiaryPreferredCallService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.BeneficiaryPreferredCallApi; import net.gepafin.tendermanagement.web.rest.api.BeneficiaryPreferredCallApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -27,10 +31,16 @@ public class BeneficiaryPreferredCallApiController implements BeneficiaryPreferr
@Autowired @Autowired
private BeneficiaryPreferredCallService beneficiaryPreferredCallService; private BeneficiaryPreferredCallService beneficiaryPreferredCallService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<BeneficiaryPreferredCallResponseBean>> createBeneficiaryPreferredCall(HttpServletRequest request, BeneficiaryPreferredCallReq beneficiaryPreferredCallReq) { public ResponseEntity<Response<BeneficiaryPreferredCallResponseBean>> createBeneficiaryPreferredCall(HttpServletRequest request, BeneficiaryPreferredCallReq beneficiaryPreferredCallReq) {
log.info("Creating Beneficiary Preferred Call"); log.info("Creating Beneficiary Preferred Call");
/** This code is responsible for creating user action logs for the "Create Beneficiary Preferred Call" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_BENEFICIARY_PREFERRED_CALL).build());
BeneficiaryPreferredCallResponseBean responseBean = beneficiaryPreferredCallService.createBeneficiaryPreferredCall(request, beneficiaryPreferredCallReq); BeneficiaryPreferredCallResponseBean responseBean = beneficiaryPreferredCallService.createBeneficiaryPreferredCall(request, beneficiaryPreferredCallReq);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.BENEFICIARY_PREFERRED_CALL_CREATED_SUCCESS_MSG))); .body(new Response<>(responseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.BENEFICIARY_PREFERRED_CALL_CREATED_SUCCESS_MSG)));
@@ -47,6 +57,12 @@ public class BeneficiaryPreferredCallApiController implements BeneficiaryPreferr
@Override @Override
public ResponseEntity<Response<BeneficiaryPreferredCallResponseBean>> getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { public ResponseEntity<Response<BeneficiaryPreferredCallResponseBean>> getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) {
log.info("Fetching Beneficiary Preferred Call by ID - ID: {}", id); log.info("Fetching Beneficiary Preferred Call by ID - ID: {}", id);
/** This code is responsible for creating user action logs for the "Get Beneficiary Preferred Call by id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_BENEFICIARY_PREFERRED_CALL).build());
BeneficiaryPreferredCallResponseBean response = beneficiaryPreferredCallService.getBeneficiaryPreferredCallById(request, id); BeneficiaryPreferredCallResponseBean response = beneficiaryPreferredCallService.getBeneficiaryPreferredCallById(request, id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_BENEFICIARY_PREFERRED_CALL_SUCCESS_MSG))); .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_BENEFICIARY_PREFERRED_CALL_SUCCESS_MSG)));
@@ -55,6 +71,10 @@ public class BeneficiaryPreferredCallApiController implements BeneficiaryPreferr
@Override @Override
public ResponseEntity<Response<Void>> deleteBeneficiaryPreferredCall(HttpServletRequest request, Long id) { public ResponseEntity<Response<Void>> deleteBeneficiaryPreferredCall(HttpServletRequest request, Long id) {
log.info("Deleting Beneficiary Preferred Call - ID: {}", id); log.info("Deleting Beneficiary Preferred Call - ID: {}", id);
/** This code is responsible for creating user action logs for the "Delete Beneficiary Preferred Call" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_BENEFICIARY_PREFERRED_CALL).build());
beneficiaryPreferredCallService.deleteBeneficiaryPreferredCall(request, id); beneficiaryPreferredCallService.deleteBeneficiaryPreferredCall(request, id);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_BENEFICIARY_PREFERRED_CALL_SUCCESS_MSG))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_BENEFICIARY_PREFERRED_CALL_SUCCESS_MSG)));
@@ -63,6 +83,11 @@ public class BeneficiaryPreferredCallApiController implements BeneficiaryPreferr
@Override @Override
public ResponseEntity<Response<Void>> updateBeneficiaryPreferredCallStatus(HttpServletRequest request, Long id, BeneficiaryCallStatus status) { public ResponseEntity<Response<Void>> updateBeneficiaryPreferredCallStatus(HttpServletRequest request, Long id, BeneficiaryCallStatus status) {
log.info("Updating status of Beneficiary Preferred Call - ID: {}, Status: {}", id, status); log.info("Updating status of Beneficiary Preferred Call - ID: {}, Status: {}", id, status);
/** This code is responsible for "Updating Beneficiary Preferred Call details" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_BENEFICIARY_PREFERRED_CALL).build());
beneficiaryPreferredCallService.updateBeneficiaryPreferredCallStatus(request, id, status); beneficiaryPreferredCallService.updateBeneficiaryPreferredCallStatus(request, id, status);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.BENEFICIARY_PREFERRED_CALL_STATUS_UPDATED_SUCCESS_MSG))); .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.BENEFICIARY_PREFERRED_CALL_STATUS_UPDATED_SUCCESS_MSG)));
@@ -71,6 +96,10 @@ public class BeneficiaryPreferredCallApiController implements BeneficiaryPreferr
@Override @Override
public ResponseEntity<Response<List<BeneficiaryPreferredCallResponseBean>>> getBeneficiaryPreferredCallByUserId(HttpServletRequest request,Long userId,Long beneficiaryId,Long companyId) { public ResponseEntity<Response<List<BeneficiaryPreferredCallResponseBean>>> getBeneficiaryPreferredCallByUserId(HttpServletRequest request,Long userId,Long beneficiaryId,Long companyId) {
log.info("Fetching all Beneficiary Preferred Calls for User ID"); log.info("Fetching all Beneficiary Preferred Calls for User ID");
/** This code is responsible for creating user action logs for the "Get Beneficiary Preferred Call" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_BENEFICIARY_PREFERRED_CALL).build());
List<BeneficiaryPreferredCallResponseBean> response = beneficiaryPreferredCallService.getBeneficiaryPreferredCallByUserId(request, userId,beneficiaryId,companyId); List<BeneficiaryPreferredCallResponseBean> response = beneficiaryPreferredCallService.getBeneficiaryPreferredCallByUserId(request, userId,beneficiaryId,companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ALL_BENEFICIARY_PREFERRED_CALLS_SUCCESS_MSG))); .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ALL_BENEFICIARY_PREFERRED_CALLS_SUCCESS_MSG)));

View File

@@ -3,6 +3,10 @@ package net.gepafin.tendermanagement.web.rest.api.impl;
import java.util.List; import java.util.List;
import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.util.LoggingUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@@ -33,10 +37,17 @@ public class CallApiController implements CallApi {
@Autowired @Autowired
private CallService callService; private CallService callService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
@Transactional(rollbackFor=Exception.class) @Transactional(rollbackFor=Exception.class)
public ResponseEntity<Response<CallResponse>> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { public ResponseEntity<Response<CallResponse>> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) {
/** This code is responsible for creating user action logs for the "Create Call Step 1" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT)
.actionContext(UserActionContextEnum.CREATE_CALL_STEP_1).build());
CallResponse createCallResponseBean = callService.createCallStep1(request, createCallRequest); CallResponse createCallResponseBean = callService.createCallStep1(request, createCallRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG)));
@@ -45,6 +56,11 @@ public class CallApiController implements CallApi {
@Override @Override
@Transactional(rollbackFor=Exception.class) @Transactional(rollbackFor=Exception.class)
public ResponseEntity<Response<CallResponse>> createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { public ResponseEntity<Response<CallResponse>> createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) {
/** This code is responsible for creating user action logs for the "Create or update Call step 2" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.CREATE_UPDATE_CALL_STEP_2).build());
CallResponse createCallResponseBean = callService.createCallStep2(request, callId, createCallRequest); CallResponse createCallResponseBean = callService.createCallStep2(request, callId, createCallRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG)));
@@ -53,29 +69,51 @@ public class CallApiController implements CallApi {
@Override @Override
@Transactional(rollbackFor=Exception.class) @Transactional(rollbackFor=Exception.class)
public ResponseEntity<Response<CallResponse>> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { public ResponseEntity<Response<CallResponse>> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) {
/** This code is responsible for creating user action logs for the "update Call step 1" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_CALL_STEP_1).build());
CallResponse createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest); CallResponse createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG))); .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG)));
} }
@Override @Override
@Transactional(readOnly = true) @Transactional
public ResponseEntity<Response<CallResponse>> getCallById(HttpServletRequest request, Long callId,Long companyId) { public ResponseEntity<Response<CallResponse>> getCallById(HttpServletRequest request, Long callId,Long companyId) {
/** This code is responsible for creating user action logs for the "get Call by id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_CALL).build());
CallResponse createCallResponseBean = callService.getCallById(request, callId,companyId); CallResponse createCallResponseBean = callService.getCallById(request, callId,companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG)));
} }
@Override @Override
@Transactional(readOnly = true) @Transactional
public ResponseEntity<Response<List<CallDetailsResponseBean>>> getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { public ResponseEntity<Response<List<CallDetailsResponseBean>>> getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) {
List<CallDetailsResponseBean> calls = callService.getAllCalls(request,companyId,onlyPreferredCall);
/** This code is responsible for creating user action logs for the "get all Calls" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW)
.actionContext(UserActionContextEnum.GET_CALL).build());
List<CallDetailsResponseBean> calls = callService.getAllCalls(request, companyId, onlyPreferredCall);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<CallResponse>> validateCallData(HttpServletRequest request, Long callId) { public ResponseEntity<Response<CallResponse>> validateCallData(HttpServletRequest request, Long callId) {
/** This code is responsible for creating user action logs for the "validate Call" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.VALIDATE_CALL).build());
CallResponse call = callService.validateCallData(request, callId); CallResponse call = callService.validateCallData(request, callId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -83,11 +121,21 @@ public class CallApiController implements CallApi {
} }
@Override @Override
public ResponseEntity<Response<CallResponse>> updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum status) { public ResponseEntity<Response<CallResponse>> updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum status) {
/** This code is responsible for creating user action logs for the "update Call status" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE)
.actionContext(UserActionContextEnum.UPDATE_CALL_STATUS).build());
CallResponse updateCall = callService.updateCallStatus(request, callId, status); CallResponse updateCall = callService.updateCallStatus(request, callId, status);
return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG))); return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<byte[]> downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { public ResponseEntity<byte[]> downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) {
/** This code is responsible for creating user action logs for the "download Call documents " operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD)
.actionContext(UserActionContextEnum.DOWNLOAD_CALL_DOCUMENT).build());
byte[] zipFile = callService.downloadCallDocumentsAsZip(request, callId); byte[] zipFile = callService.downloadCallDocumentsAsZip(request, callId);
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();

View File

@@ -3,11 +3,15 @@ package net.gepafin.tendermanagement.web.rest.api.impl;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse;
import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.CommunicationService; import net.gepafin.tendermanagement.service.CommunicationService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.CommunicationApi; import net.gepafin.tendermanagement.web.rest.api.CommunicationApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -23,10 +27,16 @@ public class CommunicationController implements CommunicationApi {
@Autowired @Autowired
CommunicationService communicationService; CommunicationService communicationService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<CommunicationResponseBean>> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, public ResponseEntity<Response<CommunicationResponseBean>> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean,
Long amendmentId) { Long amendmentId) {
/** This code is responsible for creating user action logs for the "Adding comment to amendment request" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.ADD_COMMENT_TO_AMENDMENT_REQUEST).build());
CommunicationResponseBean communicationResponseBean = communicationService.addCommentToAmendmentRequest(request,communicationRequestBean, amendmentId); CommunicationResponseBean communicationResponseBean = communicationService.addCommentToAmendmentRequest(request,communicationRequestBean, amendmentId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS)));
@@ -34,6 +44,9 @@ public class CommunicationController implements CommunicationApi {
@Override @Override
public ResponseEntity<Response<ApplicationAmendmentResponse>> getAmendmentComments(HttpServletRequest request,Long amendmentId) { public ResponseEntity<Response<ApplicationAmendmentResponse>> getAmendmentComments(HttpServletRequest request,Long amendmentId) {
/** This code is responsible for creating user action logs for the "getting comment of amendment" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_AMENDMENT_COMMENT).build());
ApplicationAmendmentResponse response = communicationService.getAmendmentComments(request,amendmentId); ApplicationAmendmentResponse response = communicationService.getAmendmentComments(request,amendmentId);
return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS))); return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS)));
} }
@@ -41,6 +54,9 @@ public class CommunicationController implements CommunicationApi {
public ResponseEntity<Response<CommunicationResponseBean>> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, public ResponseEntity<Response<CommunicationResponseBean>> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean,
Long amendmentId, Long commentId) { Long amendmentId, Long commentId) {
/** This code is responsible for creating user action logs for the "update communication comment of amendment request" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_COMMUNICATION_COMMENT).build());
CommunicationResponseBean communicationResponseBean = communicationService.updateAmendmentComment(request,communicationRequestBean, amendmentId, commentId); CommunicationResponseBean communicationResponseBean = communicationService.updateAmendmentComment(request,communicationRequestBean, amendmentId, commentId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_UPDATED_SUCCESS_MSG))); .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_UPDATED_SUCCESS_MSG)));
@@ -48,6 +64,9 @@ public class CommunicationController implements CommunicationApi {
@Override @Override
public ResponseEntity<Response<String>> deleteApplicationAmendmentComment(HttpServletRequest request, Long applicationAmendId, Long commentId) { public ResponseEntity<Response<String>> deleteApplicationAmendmentComment(HttpServletRequest request, Long applicationAmendId, Long commentId) {
/** This code is responsible for creating user action logs for the "Delete communication comment of amendment request" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_COMMENT_FROM_AMENDMENT).build());
String communicationResponseBean = communicationService.deleteComment(request,applicationAmendId, commentId); String communicationResponseBean = communicationService.deleteComment(request,applicationAmendId, commentId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_DELETED_SUCCESS_MSG))); .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_DELETED_SUCCESS_MSG)));

View File

@@ -4,6 +4,10 @@ import java.io.ByteArrayOutputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.util.LoggingUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -36,10 +40,17 @@ public class CompanyApiController implements CompanyApi{
@Autowired @Autowired
private CompanyService companyService; private CompanyService companyService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<CompanyResponse>> createCompany(HttpServletRequest request, public ResponseEntity<Response<CompanyResponse>> createCompany(HttpServletRequest request,
CompanyRequest companyRequest) { CompanyRequest companyRequest) {
log.info("Create company with - Request Body: {}", companyRequest); log.info("Create company with - Request Body: {}", companyRequest);
/** This code is responsible for creating user action logs for "Creating company" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_COMPANY).build());
CompanyResponse data = companyService.createCompany(request, companyRequest); CompanyResponse data = companyService.createCompany(request, companyRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_CREATED_SUCCESS_MSG))); .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_CREATED_SUCCESS_MSG)));
@@ -49,6 +60,10 @@ public class CompanyApiController implements CompanyApi{
public ResponseEntity<Response<CompanyResponse>> updateCompany(HttpServletRequest request, Long companyId, public ResponseEntity<Response<CompanyResponse>> updateCompany(HttpServletRequest request, Long companyId,
CompanyRequest companyRequest) { CompanyRequest companyRequest) {
log.info("Update company with - Request Body: {}", companyRequest); log.info("Update company with - Request Body: {}", companyRequest);
/** This code is responsible for creating user action logs for the "update company" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_COMPANY).build());
CompanyResponse data = companyService.updateCompany(request, companyId, companyRequest); CompanyResponse data = companyService.updateCompany(request, companyId, companyRequest);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -59,15 +74,22 @@ public class CompanyApiController implements CompanyApi{
public ResponseEntity<Response<CompanyResponse>> getCompany(HttpServletRequest request, Long companyId) { public ResponseEntity<Response<CompanyResponse>> getCompany(HttpServletRequest request, Long companyId) {
log.info("Get company with id: {}", companyId); log.info("Get company with id: {}", companyId);
/** This code is responsible for creating user action logs for the "get company" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_COMPANY).build());
CompanyResponse data = companyService.getCompany(request, companyId); CompanyResponse data = companyService.getCompany(request, companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK).body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_GET_SUCCESS_MSG)));
.body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_GET_SUCCESS_MSG)));
} }
@Override @Override
public ResponseEntity<Response<Void>> deleteCompany(HttpServletRequest request, Long companyId) { public ResponseEntity<Response<Void>> deleteCompany(HttpServletRequest request, Long companyId) {
log.info("Delete company with id: {}", companyId); log.info("Delete company with id: {}", companyId);
/** This code is responsible for creating user action logs for the "delete company" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_COMPANY).build());
companyService.deleteCompany(request, companyId); companyService.deleteCompany(request, companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -78,6 +100,10 @@ public class CompanyApiController implements CompanyApi{
public ResponseEntity<Response<List<CompanyResponse>>> getCompanyByUserId(HttpServletRequest request, Long userId) { public ResponseEntity<Response<List<CompanyResponse>>> getCompanyByUserId(HttpServletRequest request, Long userId) {
log.info("Get company with userId: {}", userId); log.info("Get company with userId: {}", userId);
/** This code is responsible for creating user action logs for the "Get company by user id" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_COMPANY_BY_USER).build());
List<CompanyResponse> data = companyService.getCompanyByUserId(request, userId); List<CompanyResponse> data = companyService.getCompanyByUserId(request, userId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
@@ -87,6 +113,10 @@ public class CompanyApiController implements CompanyApi{
@Override @Override
public ResponseEntity<Response<Map<String,Object>>> checkVatNumber(HttpServletRequest request, String vatNumber) { public ResponseEntity<Response<Map<String,Object>>> checkVatNumber(HttpServletRequest request, String vatNumber) {
log.info("check VatNumber with: {}", vatNumber); log.info("check VatNumber with: {}", vatNumber);
/** This code is responsible for creating user action logs for the "Check vat number" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.CHECK_COMPANY_VAT_NUMBER).build());
Map<String,Object> data = companyService.checkVatNumber(request, vatNumber); Map<String,Object> data = companyService.checkVatNumber(request, vatNumber);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.CHECK_VATNUMBER_SUCCESS_MSG))); .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.CHECK_VATNUMBER_SUCCESS_MSG)));
@@ -95,6 +125,10 @@ public class CompanyApiController implements CompanyApi{
@Override @Override
public ResponseEntity<byte[]> downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { public ResponseEntity<byte[]> downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) {
log.info("download company delegation with companyId: {}", companyId); log.info("download company delegation with companyId: {}", companyId);
/** This code is responsible for creating user action logs for the "Download company delegation" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DOWNLOAD).actionContext(UserActionContextEnum.DOWNLOAD_COMPANY_DELEGATION_TEMPLATE).build());
ByteArrayOutputStream data = companyService.downloadCompanyDelegation(request, companyId, companyDelegationRequest); ByteArrayOutputStream data = companyService.downloadCompanyDelegation(request, companyId, companyDelegationRequest);
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
@@ -107,6 +141,10 @@ public class CompanyApiController implements CompanyApi{
public ResponseEntity<Response<CompanyDelegationResponse>> uploadCompanyDelegation(HttpServletRequest request, Long companyId, public ResponseEntity<Response<CompanyDelegationResponse>> uploadCompanyDelegation(HttpServletRequest request, Long companyId,
MultipartFile file) { MultipartFile file) {
log.info("upload company delegation with companyId: {}", companyId); log.info("upload company delegation with companyId: {}", companyId);
/** This code is responsible for creating user action logs for the "Uploading company delegation document" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.UPLOAD_COMPANY_DELEGATION).build());
CompanyDelegationResponse companyDelegationResponse = companyService.uploadCompanyDelegation(request, companyId, file); CompanyDelegationResponse companyDelegationResponse = companyService.uploadCompanyDelegation(request, companyId, file);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(companyDelegationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_FILE_UPLOAD_SUCCESS))); .body(new Response<>(companyDelegationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_FILE_UPLOAD_SUCCESS)));
@@ -116,21 +154,33 @@ public class CompanyApiController implements CompanyApi{
public ResponseEntity<Response<CompanyDelegationResponse>> getCompanyDelegation(HttpServletRequest request, public ResponseEntity<Response<CompanyDelegationResponse>> getCompanyDelegation(HttpServletRequest request,
Long companyId) { Long companyId) {
log.info("get company delegation with companyId: {}", companyId); log.info("get company delegation with companyId: {}", companyId);
/** This code is responsible for creating user action logs for the "Get company delegation" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_COMPANY_DELEGATION).build());
CompanyDelegationResponse companyDelegationResponse = companyService.getCompanyDelegation(request, companyId); CompanyDelegationResponse companyDelegationResponse = companyService.getCompanyDelegation(request, companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(companyDelegationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_FETCH_SUCCESS))); .body(new Response<>(companyDelegationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_FETCH_SUCCESS)));
} }
@Override @Override
public ResponseEntity<Response<Void>> deleteCompanyDelegation(HttpServletRequest request, public ResponseEntity<Response<Void>> deleteCompanyDelegation(HttpServletRequest request, Long companyId) {
Long companyId) {
log.info("delete company delegation with companyId: {}", companyId); log.info("delete company delegation with companyId: {}", companyId);
/** This code is responsible for creating user action logs for the "delete company delegation" operation. **/
loggingUtil.logUserAction(
UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_COMPANY_DELEGATION).build());
companyService.deleteCompanyDelegation(request, companyId); companyService.deleteCompanyDelegation(request, companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK).body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_DELETE_SUCCESS)));
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_DELETE_SUCCESS)));
} }
@Override @Override
public ResponseEntity<Response<Void>> removeCompanyFromList(HttpServletRequest request, Long companyId) { public ResponseEntity<Response<Void>> removeCompanyFromList(HttpServletRequest request, Long companyId) {
log.info("Api to remove a company from user's list"); log.info("Api to remove a company from user's list");
/** This code is responsible for creating user action logs for the "Remove company from user list" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.REMOVE_COMPANY_FROM_USER).build());
companyService.removeCompanyFromList(request, companyId); companyService.removeCompanyFromList(request, companyId);
return ResponseEntity.status(HttpStatus.OK) return ResponseEntity.status(HttpStatus.OK)

View File

@@ -3,10 +3,14 @@ package net.gepafin.tendermanagement.web.rest.api.impl;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean; import net.gepafin.tendermanagement.model.response.BeneficiaryWidgetResponseBean;
import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean; import net.gepafin.tendermanagement.model.response.SuperAdminWidgetResponseBean;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.DashboardService; import net.gepafin.tendermanagement.service.DashboardService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.DashboardApi; import net.gepafin.tendermanagement.web.rest.api.DashboardApi;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -22,14 +26,25 @@ public class DashboardApiController implements DashboardApi {
@Autowired @Autowired
private DashboardService dashboardService; private DashboardService dashboardService;
@Autowired
private LoggingUtil loggingUtil;
@Override @Override
public ResponseEntity<Response<SuperAdminWidgetResponseBean>> getDashboardWidgetForSuperAdmin(HttpServletRequest request) { public ResponseEntity<Response<SuperAdminWidgetResponseBean>> getDashboardWidgetForSuperAdmin(HttpServletRequest request) {
/** This code is responsible for creating user action logs for the "Get dashboard widget for super admin" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_DASHBOARD_WIDGET_FOR_SUPER_ADMIN).build());
SuperAdminWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForSuperAdmin(request); SuperAdminWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForSuperAdmin(request);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); } .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); }
@Override @Override
public ResponseEntity<Response<BeneficiaryWidgetResponseBean>> getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId) { public ResponseEntity<Response<BeneficiaryWidgetResponseBean>> getDashboardWidgetForBeneficiary(HttpServletRequest request, Long companyId) {
/** This code is responsible for creating user action logs for the "Get dashboard widget for beneficiary" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_DASHBOARD_WIDGET_FOR_BENEFICIARY).build());
BeneficiaryWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForBeneficiary(request, companyId); BeneficiaryWidgetResponseBean widgetResponseBean= dashboardService.getDashboardWidgetForBeneficiary(request, companyId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY))); .body(new Response<>(widgetResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY)));

View File

@@ -3,11 +3,16 @@ package net.gepafin.tendermanagement.web.rest.api.impl;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.dao.DocumentDao;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum;
import net.gepafin.tendermanagement.enums.UserActionContextEnum;
import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean;
import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.DocumentService;
import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.DocumentApi; import net.gepafin.tendermanagement.web.rest.api.DocumentApi;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -27,10 +32,21 @@ DocumentApiController implements DocumentApi {
@Autowired @Autowired
private DocumentService documentService; private DocumentService documentService;
@Autowired
private LoggingUtil loggingUtil;
@Autowired
private DocumentDao documentDao;
@Override @Override
public ResponseEntity<Response<List<DocumentResponseBean>>> uploadFile(HttpServletRequest httpServletRequest, Long sourceId, DocumentSourceTypeEnum sourceType, public ResponseEntity<Response<List<DocumentResponseBean>>> uploadFile(HttpServletRequest httpServletRequest, Long sourceId, DocumentSourceTypeEnum sourceType,
List<MultipartFile> files, DocumentTypeEnum fileType) { List<MultipartFile> files, DocumentTypeEnum fileType) {
try { try {
UserActionContextEnum userActionContext = documentDao.getUserActionContextEnum(sourceType, fileType);
/** This code is responsible for creating user action logs for the "upload document for call or application" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPLOAD).actionContext(userActionContext).build());
List<DocumentResponseBean> responseBeans = documentService.uploadFile(files, sourceId, sourceType, fileType); List<DocumentResponseBean> responseBeans = documentService.uploadFile(files, sourceId, sourceType, fileType);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<List<DocumentResponseBean>>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); .body(new Response<List<DocumentResponseBean>>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG)));
@@ -40,6 +56,10 @@ DocumentApiController implements DocumentApi {
} }
@Override @Override
public ResponseEntity<Response<Void>> deleteFile(HttpServletRequest httpServletRequest, Long documentId) { public ResponseEntity<Response<Void>> deleteFile(HttpServletRequest httpServletRequest, Long documentId) {
/** This code is responsible for creating user action logs for the "delete document" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_DOCUMENT).build());
documentService.deleteFile(documentId); documentService.deleteFile(documentId);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<Void>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG))); .body(new Response<Void>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILE_DELETED_SUCCESSFULLY_MSG)));
@@ -47,6 +67,12 @@ DocumentApiController implements DocumentApi {
@Override @Override
public ResponseEntity<Response<DocumentResponseBean>> updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { public ResponseEntity<Response<DocumentResponseBean>> updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) {
UserActionContextEnum userActionContext = documentDao.getUserActionContextForUpdatingDocOrImage(documentTypeEnum);
/** This code is responsible for creating user action logs for the "update document or image" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPDATE).actionContext(userActionContext).build());
DocumentResponseBean responseBeans = documentService.updateDocument(httpServletRequest, documentId, file, documentTypeEnum); DocumentResponseBean responseBeans = documentService.updateDocument(httpServletRequest, documentId, file, documentTypeEnum);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<DocumentResponseBean>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPDATED_SUCCESSFULLY))); .body(new Response<DocumentResponseBean>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPDATED_SUCCESSFULLY)));
@@ -54,6 +80,10 @@ DocumentApiController implements DocumentApi {
@Override @Override
public ResponseEntity<Response<DocumentResponseBean>> getDocumentById(HttpServletRequest request, Long id) { public ResponseEntity<Response<DocumentResponseBean>> getDocumentById(HttpServletRequest request, Long id) {
/** This code is responsible for creating user action logs for the "Get Document" operation. **/
loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_DOCUMENT).build());
DocumentResponseBean documentResponseBean = documentService.getDocument(request, id); DocumentResponseBean documentResponseBean = documentService.getDocument(request, id);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<DocumentResponseBean>(documentResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_FETCHED_SUCCESSFULLY))); .body(new Response<DocumentResponseBean>(documentResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_FETCHED_SUCCESSFULLY)));

Some files were not shown because too many files have changed in this diff Show More