diff --git a/pom.xml b/pom.xml
index 08c677d0..f3424e44 100644
--- a/pom.xml
+++ b/pom.xml
@@ -225,6 +225,11 @@
3.0.0
+
+
+ org.springframework
+ spring-test
+
diff --git a/src/main/java/net/gepafin/tendermanagement/config/CachedBodyFilter.java b/src/main/java/net/gepafin/tendermanagement/config/CachedBodyFilter.java
new file mode 100644
index 00000000..c164dc60
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/CachedBodyFilter.java
@@ -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);
+ }
+ }
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/CachedBodyHttpServletRequest.java b/src/main/java/net/gepafin/tendermanagement/config/CachedBodyHttpServletRequest.java
new file mode 100644
index 00000000..f5c1582b
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/CachedBodyHttpServletRequest.java
@@ -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) {
+
+ }
+ }
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/RequestCachingFilter.java b/src/main/java/net/gepafin/tendermanagement/config/RequestCachingFilter.java
new file mode 100644
index 00000000..1ce8c840
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/RequestCachingFilter.java
@@ -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);
+ }
+ }
+}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/UniqueSessionInterceptor.java b/src/main/java/net/gepafin/tendermanagement/config/UniqueSessionInterceptor.java
new file mode 100644
index 00000000..9f438d91
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/config/UniqueSessionInterceptor.java
@@ -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();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java
index 4d8d5948..8f8f3131 100644
--- a/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java
+++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/JWTFilter.java
@@ -1,43 +1,48 @@
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;
-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;
- private final TokenProvider tokenProvider;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
- public JWTFilter(TokenProvider tokenProvider) {
- this.tokenProvider = tokenProvider;
- }
+public class JWTFilter extends OncePerRequestFilter {
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
- throws IOException, ServletException {
- HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
- String token = resolveToken(httpServletRequest);
+ private final TokenProvider tokenProvider;
- if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
- Authentication authentication = tokenProvider.getAuthentication(token);
- if (authentication != null) {
- SecurityContextHolder.getContext().setAuthentication(authentication);
- }
- }
+ public JWTFilter(TokenProvider tokenProvider) {
+ this.tokenProvider = tokenProvider;
+ }
- filterChain.doFilter(servletRequest, servletResponse);
- }
+ protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
+ FilterChain filterChain) throws ServletException, IOException {
- private String resolveToken(HttpServletRequest request) {
- String bearerToken = request.getHeader("Authorization");
- return StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ") ? bearerToken.substring(7) : null;
- }
+ try {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+ String token = resolveToken(httpServletRequest);
+
+ if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
+ Authentication authentication = tokenProvider.getAuthentication(token);
+ if (authentication != null) {
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+ }
+ }
+
+ filterChain.doFilter(servletRequest, servletResponse);
+ } catch (Exception e) {
+ servletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ }
+
+ }
+
+ private String resolveToken(HttpServletRequest request) {
+ String bearerToken = request.getHeader("Authorization");
+ return StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ") ? bearerToken.substring(7) : null;
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
index 884c848f..fa4ad277 100644
--- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
+++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java
@@ -1,18 +1,21 @@
package net.gepafin.tendermanagement.config.jwt;
-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 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;
+import static io.micrometer.common.util.StringUtils.isEmpty;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.crypto.SecretKey;
+
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateUtils;
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.GrantedAuthority;
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.UserDetails;
import org.springframework.stereotype.Component;
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 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
@@ -45,17 +58,18 @@ public class TokenProvider {
private String secretKey;
@Value("${security.authentication.jwt.token-validity-in-seconds}")
- private long tokenValidityInSeconds;
+ private int tokenValidityInSeconds;
@Autowired
private UserRepository userRepository;
+ @Autowired
+ HttpServletResponse response;
+
private SecretKey key;
- private static final String AUTHORITIES_KEY = "auth";
private static final String MERCHANTID="merchantId";
static final String AUTH_SECRET = "X-Api-Secret";
- private final Set invalidatedTokens = new HashSet<>();
private static final String USER_ID = "userId";
public UserEntity validateUser(Map userInfo) {
@@ -82,40 +96,40 @@ public class TokenProvider {
log.info("JWT Secret Key initialized.");
}
- public String createToken(Boolean rememberMe, UserEntity user) {
-// String authorities = authentication.getAuthorities().stream()
-// .map(GrantedAuthority::getAuthority)
-// .collect(Collectors.joining(","));
- String authorities = user.getRoleEntity().getRoleType();
+ public String createToken(Boolean rememberMe, UserEntity user, Long loginAttemptId) {
+ // String authorities = authentication.getAuthorities().stream()
+ // .map(GrantedAuthority::getAuthority)
+ // .collect(Collectors.joining(","));
+ String authorities = user.getRoleEntity().getRoleType();
Long now;
Date validity;
if (Boolean.TRUE.equals(rememberMe)) {
- now = DateUtils.addMonths(new Date(), 2).getTime();
+ now = DateUtils.addDays(new Date(), 2).getTime();
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 {
- now = (new Date()).getTime();
- validity = new Date(now + (this.tokenValidityInSeconds * 1000));
+ now = DateUtils.addSeconds(new Date(), this.tokenValidityInSeconds).getTime();
+ validity = new Date(now);
log.info("Creating token with standard validity of {} seconds.", this.tokenValidityInSeconds);
}
String payload = user.getEmail();
if(user != null) {
payload += ":"+user.getId();
- }
-
- if(user != null) {
payload += ":"+user.getHub().getId();
}
String token = Jwts.builder()
.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)
.setExpiration(validity)
.compact();
+ response.setHeader("Authorization", "Bearer " + token);
log.debug("Generated token: {}", token);
return token;
}
@@ -143,32 +157,15 @@ public class TokenProvider {
return authorities;
}
- public boolean validateToken(String authToken) {
- try {
- if (isTokenInvalid(authToken)) {
- log.warn("Token is invalidated.");
- return false;
- }
- Jwts.parserBuilder()
- .setSigningKey(key)
- .build()
- .parseClaimsJws(authToken);
- log.info("Token is valid.");
- return true;
- } catch (Exception e) {
- log.error("Token validation failed: {}", e.getMessage());
- return false;
- }
- }
+ public boolean validateToken(String authToken) {
- public void invalidateToken(String token) {
- invalidatedTokens.add(token);
- log.info("Token invalidated: {}", token);
- }
+ Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken);
+ log.info("Token is valid.");
+ return true;
- public boolean isTokenInvalid(String token) {
- return invalidatedTokens.contains(token);
- }
+ }
+
+
public Map getUserInfoAndUserIdFromToken(HttpServletRequest request) {
Map userInfo = new HashMap<>();
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
}
+ 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;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
index e3304967..dbf39e8f 100644
--- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
+++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
@@ -156,7 +156,7 @@ public class GepafinConstant {
public static final String IS_PIVA = "isPIVA";
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 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 CODICE_FISCALE_EXISTS = "codice.fiscale.exists";
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 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 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 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";
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java
index c2054ef3..c9c19708 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java
@@ -11,11 +11,11 @@ import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
import net.gepafin.tendermanagement.enums.*;
import net.gepafin.tendermanagement.model.request.*;
-import net.gepafin.tendermanagement.model.request.AmendmentFormField.AmendmentIsUploadedByEnum;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.*;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -34,6 +34,7 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
+import static java.time.temporal.ChronoUnit.DAYS;
import static net.gepafin.tendermanagement.util.Utils.log;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
@@ -92,6 +93,18 @@ public class ApplicationAmendmentRequestDao {
@Autowired
private EmailLogDao emailLogDao;
+ @Autowired
+ private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
+
+ @Autowired
+ LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
+ @Autowired
+ private AssignedApplicationsDao assignedApplicationsDao;
+
public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) {
log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId);
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId);
@@ -199,11 +212,18 @@ public class ApplicationAmendmentRequestDao {
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity();
applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote());
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.setIsNotification(applicationAmendmentRequest.getIsSendNotification());
applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue());
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId);
+ //cloned for old data entity
+ ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity);
applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity);
Long applicationId = applicationEvaluationEntity.getApplicationId();
@@ -214,7 +234,7 @@ public class ApplicationAmendmentRequestDao {
List formFieldRequestBean = applicationAmendmentRequest.getFormFields().stream()
.filter(AmendmentFormFieldResponse::isSelected)
.map(amendmentFormFieldRequest -> {
- AmendmentFormField formField = new AmendmentFormField();
+ AmendmentFormField formField = new AmendmentFormField();
formField.setFieldId(amendmentFormFieldRequest.getFieldId());
formField.setFieldValue(null);
return formField;
@@ -223,41 +243,77 @@ public class ApplicationAmendmentRequestDao {
String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean);
applicationAmendmentRequestEntity.setFormFields(formFieldsJson);
}
+ List 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());
Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub());
ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(
applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber,
userEntity.getHub().getId());
applicationAmendmentRequestEntity.setProtocol(protocolEntity);
- ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity);
+ ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity, null, VersionActionTypeEnum.INSERT);
String evaluationStatusType = applicationEvaluationEntity.getStatus();
if (Boolean.FALSE.equals(evaluationStatusType.equals((ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue())))){
applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
+
+ //Set Status
+ applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
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 oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
String applicationStatusType = applicationEntity.getStatus();
if (Boolean.FALSE.equals(applicationStatusType.equals((ApplicationStatusTypeEnum.SOCCORSO.getValue())))) {
applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue());
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);
String assignedStatusType = assignedApplicationsEntity.getStatus();
+ AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity);
if (Boolean.FALSE.equals(assignedStatusType.equals((AssignedApplicationEnum.SOCCORSO.getValue())))) {
assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue());
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;
}
- public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) {
+ public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity,ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity,VersionActionTypeEnum actionTypeEnum) {
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;
}
public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) {
ApplicationAmendmentRequestResponse response = initializeBasicResponse(applicationAmendmentRequestEntity);
-
+
List forms = applicationFormRepository.findByApplicationId(applicationAmendmentRequestEntity.getApplicationId());
Map fieldIdToLabelMap = extractFieldIdToLabelMap(forms);
@@ -282,7 +338,8 @@ public class ApplicationAmendmentRequestDao {
LocalDateTime startDate = entity.getStartDate();
response.setStartDate(startDate);
- response.setExpirationDate(startDate.plus(expirationDays, ChronoUnit.DAYS));
+ response.setExpirationDate(entity.getEndDate());
+ response.setEvaluationEndDate(entity.getApplicationEvaluationEntity().getEndDate());
response.setIsSendEmail(entity.getIsEmail());
response.setIsSendNotification(entity.getIsNotification());
@@ -392,8 +449,9 @@ public class ApplicationAmendmentRequestDao {
public void deleteById(Long id) {
log.info("Deleting assigned application with ID: {}", id);
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id);
+ ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);
applicationAmendmentRequestEntity.setIsDeleted(true);
- saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity);
+ saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity,oldApplicationAmendmentEntity,VersionActionTypeEnum.SOFT_DELETE);
log.info(" Application amendment deleted with ID: {}", id);
}
@@ -441,13 +499,14 @@ public class ApplicationAmendmentRequestDao {
log.info("Updating application amendement with ID: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
+ ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment);
setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote());
-
+
Map amendmentFormFieldMap = Utils
.convertJsonStringToList(existingApplicationAmendment.getFormFields(), AmendmentFormField.class)
.stream().collect(Collectors.toMap(AmendmentFormField::getFieldId, Function.identity()));
Map applicationFormFieldMap = getApplicationFormFieldList(existingApplicationAmendment, amendmentFormFieldMap.keySet().stream().toList()).stream().collect(Collectors.toMap(ApplicationFormFieldEntity::getFieldId, Function.identity()));
-
+
if(updateRequest.getApplicationFormFields() != null) {
updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{
AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId());
@@ -457,8 +516,9 @@ public class ApplicationAmendmentRequestDao {
});
existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList()));
}
-
- ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment);
+ existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
+
+ ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE);
ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment);
log.info("Application Amendment updated successfully: {}", response);
return response;
@@ -495,7 +555,7 @@ public class ApplicationAmendmentRequestDao {
// Step 4: Return the updated currentIds
return applicationFormFieldIds;
-
+
}
@@ -514,7 +574,7 @@ public class ApplicationAmendmentRequestDao {
List fieldIds) {
List applicationFormList = applicationFormRepository
.findByApplicationId(applicationAmendment.getApplicationId());
-
+
return applicationFormList.stream().flatMap(applicationForm -> applicationFormFieldRepository
.findByApplicationFormIdAndFieldIdIn(applicationForm.getId(), fieldIds).stream()).toList();
}
@@ -547,7 +607,7 @@ public class ApplicationAmendmentRequestDao {
requestedDocumentIds.forEach(documentId -> documentService.validateDocument(documentId).getId());
existingDocumentIds.stream().filter(documentId -> !requestedDocumentIds.contains(documentId))
.forEach(this::softDeleteDocument);
-
+
String newFieldValue = String.join(",",
requestedDocumentIds.stream().map(String::valueOf).collect(Collectors.toList()));
@@ -570,11 +630,11 @@ public class ApplicationAmendmentRequestDao {
private void setIsUploadedBy(AmendmentFormField amendmentFormField) {
if(validator.checkIsBeneficiary()) {
- amendmentFormField.setIsUploadedBy(AmendmentIsUploadedByEnum.BENEFICIARY.getValue());
+ amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue());
}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) {
+
log.info("Closing application amendement with ID: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
+ //cloned entity for old data and versioning
+ ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment);
+ List 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::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue());
- ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment);
+ ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment, oldApplicationAmendmentEntity,
+ VersionActionTypeEnum.UPDATE);
ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment);
- List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(existingApplicationAmendment.getApplicationEvaluationEntity().getId());
- Boolean allClosed = amendmentRequests.stream()
- .allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()));
+ List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(
+ existingApplicationAmendment.getApplicationEvaluationEntity().getId());
+ Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()));
ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId());
- if (Boolean.TRUE.equals(allClosed)){
+ ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application);
+ if (Boolean.TRUE.equals(allClosed)) {
existingApplicationAmendment.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
- applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity());
- application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue());
- applicationRepository.save(application);
- existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue());
- assignedApplicationsRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity());
- log.info("All amendments are closed. Application Evaluation status set to OPEN.");
+
+ if (allClosed) {
+ ApplicationEvaluationEntity existingApplicationEvaluationEntity = existingApplicationAmendment.getApplicationEvaluationEntity();
+
+ ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(existingApplicationEvaluationEntity);
+ existingApplicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
+ applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity());
+
+ application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue());
+ applicationRepository.save(application);
+ existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue());
+
+ 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("Application Amendment closed successfully: {}", response);
}
- log.info("Application Amendment closed successfully: {}", response);
return response;
}
public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) {
- ApplicationAmendmentRequestEntity request = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id)
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
+ ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id);
if (newResponseDays != null && newResponseDays > 0) {
- Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L;
- request.setResponseDays(currentResponseDays + newResponseDays);
- applicationAmendmentRequestRepository.save(request);
+ ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity);
+ Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L;
+ 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 getAmendmentByApplicationId(HttpServletRequest request, Long applicationId, List statuses) {
@@ -835,10 +942,14 @@ public class ApplicationAmendmentRequestDao {
log.info("Updating application amendment with status: {}", 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))) {
existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue());
existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
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);
log.info("Amendment status updated successfully: {}", response);
@@ -846,23 +957,23 @@ public class ApplicationAmendmentRequestDao {
}
public void sendReminderEmail(Long amendmentId) {
+
ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId)
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)));
Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId());
if (entityOptional.isPresent()) {
ApplicationEntity applicationEntity = applicationService.validateApplication(entityOptional.get().getApplicationId());
UserEntity beneficiaryUser = userService.validateUser(applicationEntity.getUserId());
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
- SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService
- .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER, hub, null);
+ SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER, hub, null);
String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser);
String body = prepareBody(emailTemplate, amendment, beneficiaryUser);
String email = beneficiaryUser.getEmail();
- 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());
- emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest);
+ 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());
+ emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest);
} else {
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());
bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY));
} else {
-
bodyPlaceholders.put("{{amendment_due_date}}", "Not available");
}
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 getApplicationAmendmentRequestEntitiesByApplicationEvaluationId(Long applicationEvaluationId){
+ List applicationAmendmentRequestEntities=new ArrayList<>();
+ applicationAmendmentRequestEntities=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(applicationEvaluationId,ApplicationAmendmentRequestEnum.CLOSE.getValue());
+ return applicationAmendmentRequestEntities;
+ }
private void softDeleteDocument(Long documentId) {
documentService.deleteFile(documentId);
}
-
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
index 017870ed..e3726e41 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
@@ -1,6 +1,7 @@
package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator;
+import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
@@ -9,6 +10,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBea
import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
import net.gepafin.tendermanagement.model.request.EmailLogRequest;
+import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*;
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.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.FieldValidator;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -145,13 +148,25 @@ public class ApplicationDao {
@Autowired
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) {
FormEntity formEntity = formService.validateForm(formId);
// callService.validatePublishedCall(formEntity.getCall().getId());
validateFormFields(applicationRequestBean,formEntity);
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()))) {
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);
return getApplicationById(applicationEntity.getId(),formEntity.getId());
}
- public void validateDelegation(UserEntity user, CompanyEntity company) {
- UserWithCompanyEntity userWithCompany = companyService.getUserWithCompanyEntity(user.getId(), company.getId());
+ public void validateDelegation(UserEntity user, UserWithCompanyEntity userWithCompany) {
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
- .findByUserIdAndCompanyIdAndStatus(user.getId(), company.getId(),
+ .findByUserIdAndUserWithCompanyIdAndStatus(user.getId(), userWithCompany.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue());
if (!userWithCompany.getIsLegalRepresentant() && userCompanyDelegationEntity == null) {
@@ -187,13 +201,14 @@ public class ApplicationDao {
return applicationFormEntity;
}
- public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, CompanyEntity companyEntity) {
- validateDelegation(user,companyEntity);
+ public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, UserWithCompanyEntity userWithCompany) {
+ validateDelegation(user,userWithCompany);
ApplicationEntity entity = new ApplicationEntity();
entity.setUserId(user.getId());
- entity.setCompany(companyEntity);
+ entity.setCompanyId(userWithCompany.getCompanyId());
entity.setCall(call);
entity.setHubId(call.getHub().getId());
+ entity.setUserWithCompany(userWithCompany);
entity.setIsDeleted(false);
entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue());
return entity;
@@ -259,12 +274,21 @@ public class ApplicationDao {
}
public void deleteById(HttpServletRequest request, Long id) {
+
log.info("Deleting application with ID: {}", 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=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);
}
@@ -328,9 +352,9 @@ public class ApplicationDao {
if (callId != null) {
predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId));
}
- if (companyId != null) {
- predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId));
- }
+ if (companyId != null) {
+ predicate = builder.and(predicate, builder.equal(root.get("companyId"), companyId));
+ }
if (statusList != null && !statusList.isEmpty()) {
List statusNames = statusList.stream()
.map(Enum::name)
@@ -351,7 +375,7 @@ public class ApplicationDao {
List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList);
Long completedSteps= Long.valueOf(flowFormDao.getCompletedSteps(applicationEntity));
- Integer progress=calculateProgress(totalFormSteps,completedSteps);
+ Integer progress = calculateProgress(totalFormSteps, completedSteps);
responseBean.setId(applicationEntity.getId());
responseBean.setProgress(progress);
responseBean.setCallTitle(applicationEntity.getCall().getName());
@@ -361,8 +385,9 @@ public class ApplicationDao {
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
responseBean.setStatus(applicationEntity.getStatus());
responseBean.setComments(applicationEntity.getComments());
- responseBean.setCompanyId(applicationEntity.getCompany().getId());
- responseBean.setCompanyName(applicationEntity.getCompany().getCompanyName());
+ responseBean.setCompanyId(applicationEntity.getCompanyId());
+ CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
+ responseBean.setCompanyName(company.getCompanyName());
if(applicationEntity.getProtocol() != null) {
responseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber());
}
@@ -392,57 +417,83 @@ public class ApplicationDao {
}
private ApplicationFormEntity getApplicationFormOrCreate(FormEntity formEntity, ApplicationEntity applicationEntity) {
+
ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), formEntity.getId());
- if(applicationFormEntity == null){
+ ApplicationFormEntity oldApplicationFormEntity = Utils.getClonedEntityForData(applicationFormEntity);
+ if (applicationFormEntity == null) {
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;
}
- public List createOrUpdateMultipleFormFields(List formFieldResponseBeans, ApplicationFormEntity applicationFormEntity,FormEntity formEntity) {
+ public List createOrUpdateMultipleFormFields(List formFieldResponseBeans,
+ ApplicationFormEntity applicationFormEntity, FormEntity formEntity) {
+
List existingFields = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId());
- List applicationFormFieldEntity = formFieldResponseBeans.stream()
- .map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity,existingFields,formEntity))
+ return formFieldResponseBeans.stream().map(requestBean -> createOrUpdateApplicationFormField(requestBean, applicationFormEntity, existingFields, formEntity))
.collect(Collectors.toList());
- return applicationFormFieldEntity;
}
- public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, ApplicationFormEntity applicationFormEntity,List applicationFormFieldEntities ,FormEntity formEntity) {
+ public ApplicationFormFieldEntity createOrUpdateApplicationFormField(ApplicationFormFieldRequestBean applicationFormFieldRequestBean,
+ ApplicationFormEntity applicationFormEntity, List applicationFormFieldEntities, FormEntity formEntity) {
- ApplicationFormFieldEntity applicationFormFieldEntity=null;
+ ApplicationFormFieldEntity applicationFormFieldEntity = new ApplicationFormFieldEntity();
- List newDocumentIds =validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
+ List newDocumentIds = validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
+ validateFileUploadDocuments(applicationFormFieldRequestBean, formEntity);
+ VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
- if(applicationFormFieldEntities==null || applicationFormFieldEntities.isEmpty()){
- applicationFormFieldEntity = new ApplicationFormFieldEntity();
+ ApplicationFormFieldEntity oldApplicationFormFieldData = null;
+
+ if (applicationFormFieldEntities == null || applicationFormFieldEntities.isEmpty()) {
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
- }else {
+ } else {
for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) {
if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) {
applicationFormFieldEntity = applicationFormFieldEntity1;
- if(applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())){
- validateRequiredFields(applicationFormEntity.getForm(),applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId());
+ oldApplicationFormFieldData = Utils.getClonedEntityForData(applicationFormFieldEntity);
+ if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())) {
+ validateRequiredFields(applicationFormEntity.getForm(), applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId());
}
+ actionType = VersionActionTypeEnum.UPDATE;
break;
} else {
- applicationFormFieldEntity = new ApplicationFormFieldEntity();
applicationFormFieldEntity.setApplicationForm(applicationFormEntity);
}
}
}
Utils.setIfUpdated(applicationFormFieldEntity::getFieldId, applicationFormFieldEntity::setFieldId, applicationFormFieldRequestBean.getFieldId());
- if(applicationFormFieldRequestBean.getFieldValue() !=null ) {
- updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null,false);
+ if (applicationFormFieldRequestBean.getFieldValue() != null) {
+ updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean, formEntity, newDocumentIds, null, false);
applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue()));
}
- if(applicationFormFieldRequestBean.getFieldValue() ==null ) {
- updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean,formEntity,newDocumentIds,null,false);
+ if (applicationFormFieldRequestBean.getFieldValue() == null) {
+ updateDocumentDeletionStatus(applicationFormFieldEntity, applicationFormFieldRequestBean, formEntity, newDocumentIds, null, false);
+ }
+ if (applicationFormFieldRequestBean.getFieldValue() != null) {
+ applicationFormFieldEntity.setFieldValue(Utils.convertObjectToJsonString(applicationFormFieldRequestBean.getFieldValue()));
+ } else {
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 newDocumentIds,
List preInstructorDocumentId,boolean isPreInstructor) {
if (newDocumentIds == null) {
@@ -505,9 +556,6 @@ public class ApplicationDao {
}
}
-
-
-
private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) {
List documentIds=null;
// List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class);
@@ -570,8 +618,14 @@ public class ApplicationDao {
applicationFormFieldResponseBean.setUpdatedDate(applicationFormFieldEntity.getUpdatedDate());
return applicationFormFieldResponseBean;
}
- public ApplicationEntity saveApplicationEntity(ApplicationEntity application){
- ApplicationEntity applicationEntity=applicationRepository.save(application);
+
+ public ApplicationEntity saveApplicationEntity(ApplicationEntity 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;
}
@@ -701,11 +755,12 @@ public class ApplicationDao {
applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
applicationGetResponseBean.setCallId(applicationEntity.getCall().getId());
applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName());
- applicationGetResponseBean.setCompanyId(applicationEntity.getCompany().getId());
+ applicationGetResponseBean.setCompanyId(applicationEntity.getCompanyId());
if(applicationEntity.getProtocol() != null) {
applicationGetResponseBean.setProtocolNumber(applicationEntity.getProtocol().getProtocolNumber());
}
- applicationGetResponseBean.setCompanyName(applicationEntity.getCompany().getCompanyName());
+ CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
+ applicationGetResponseBean.setCompanyName(company.getCompanyName());
return applicationGetResponseBean;
}
@@ -722,40 +777,51 @@ public class ApplicationDao {
public ApplicationResponse createApplicationByCallId(CompanyEntity companyEntity,
ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) {
CallEntity call = callService.validateCall(callId);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId());
+
// call = callService.validatePublishedCall(call.getId());
- checkIfApplicationExists(call, companyEntity, userEntity);
- ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, companyEntity);
+ checkIfApplicationExists(call, userWithCompanyEntity, userEntity);
+ ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity);
applicationEntity.setComments(applicationRequest.getComments());
applicationEntity = saveApplicationEntity(applicationEntity);
- ApplicationResponse applicationResponse = getApplicationResponse(applicationEntity);
- return applicationResponse;
+ return getApplicationResponse(applicationEntity);
}
- public void checkIfApplicationExists(CallEntity call, CompanyEntity companyEntity, UserEntity userEntity){
- Optional applicationEntity=applicationRepository.findByUserIdAndCompanyIdAndCallIdAndIsDeletedFalse(userEntity.getId(), companyEntity.getId(),call.getId());
+ public void checkIfApplicationExists(CallEntity call, UserWithCompanyEntity userWithCompanyEntity, UserEntity userEntity){
+ Optional applicationEntity=applicationRepository.findByUserIdAndUserWithCompanyIdAndCallIdAndIsDeletedFalse(userEntity.getId(), userWithCompanyEntity.getId(),call.getId());
if(applicationEntity.isPresent()){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS));
}
}
public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
+
ApplicationEntity applicationEntity = validateApplication(applicationId);
+
+ //cloned entity for old application data
+ ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
+
UserEntity userEntity = userService.validateUser(applicationEntity.getUserId());
- validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE));
}
- if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(status.getValue()))){
- throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS));
+ if (Boolean.TRUE.equals(applicationEntity.getStatus().equals(status.getValue()))) {
+ throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS));
}
- if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) {
+ if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) {
callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId());
Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub());
- ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity,protocolNumber, userEntity.getHub().getId());
+ ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId());
applicationEntity.setProtocol(protocolEntity);
applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue());
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);
sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity);
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()))) {
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);
}
-
public Integer calculateProgress(Long totalSteps, Long completedSteps) {
if (FieldValidator.isNullOrZero(totalSteps)) {
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO));
@@ -838,7 +907,17 @@ public class ApplicationDao {
if (nextApplicationFormEntity != null) {
List 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);
+
+ /** 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);
}
}
@@ -846,7 +925,7 @@ public class ApplicationDao {
private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity) {
CallEntity call =applicationEntity.getCall();
- CompanyEntity company = applicationEntity.getCompany();
+ CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
ProtocolEntity protocol = applicationEntity.getProtocol();
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
@@ -889,7 +968,7 @@ public class ApplicationDao {
recipientEmails.add(contactEmail);
}
if(Boolean.FALSE.equals(recipientEmails.isEmpty())){
- emailLogRequest.setRecipientId(applicationEntity.getCompany().getId());
+ emailLogRequest.setRecipientId(applicationEntity.getCompanyId());
emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY);
emailLogRequest.setRecipientEmails(companyEmail);
}
@@ -897,7 +976,7 @@ public class ApplicationDao {
}
private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) {
CallEntity call = applicationEntity.getCall();
- CompanyEntity company = applicationEntity.getCompany();
+ CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
ProtocolEntity protocol = applicationEntity.getProtocol();
HubEntity hub = hubService.valdateHub(applicationEntity.getHubId());
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
@@ -936,32 +1015,46 @@ public class ApplicationDao {
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest);
emailLogRequest.setRecipientEmails(rinaldoEmail);
emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest);
-
}
public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId,
MultipartFile file) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
- validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+
+ //cloned entity for old data
+ ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(applicationEntity);
+
validateFileTypeForCall(file, applicationEntity);
- ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
- .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
- if (applicationSignedDocument != null) {
- throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED));
-// applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
-// applicationSignedDocumentRepository.save(applicationSignedDocument);
- }
- UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file,
- applicationEntity.getCall().getId(), applicationId);
+ ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository.findByApplicationIdAndStatus(applicationId,
+ ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ //cloned entity for old data
+ ApplicationSignedDocumentEntity oldApplicationSingedDocumentData = Utils.getClonedEntityForData(applicationSignedDocument);
+
+ if (applicationSignedDocument != null) {
+ throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED));
+ // applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
+ // applicationSignedDocumentRepository.save(applicationSignedDocument);
+ }
+ UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, applicationEntity.getCall().getId(), applicationId);
applicationSignedDocument = new ApplicationSignedDocumentEntity();
- applicationSignedDocument.setApplication(applicationEntity);
- applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName());
- applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath());
- applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
- applicationSignedDocumentRepository.save(applicationSignedDocument);
+ applicationSignedDocument.setApplication(applicationEntity);
+ applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName());
+ applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath());
+ applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ 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());
- applicationRepository.save(applicationEntity);
- return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument);
- }
+ 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);
+ }
private void validateFileTypeForCall(MultipartFile file, ApplicationEntity applicationEntity) {
List validCallIds = Arrays.asList(callId.split(","));
@@ -983,7 +1076,7 @@ public class ApplicationDao {
}
private String generateS3PathForDelegation(Long callId, Long applicationId) {
try {
- return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId);
+ return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L);
} catch (IllegalArgumentException e) {
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) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
- validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
@@ -1030,36 +1123,51 @@ public class ApplicationDao {
public void deleteSignedDocument(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
- validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ //cloned entity for old data
+ ApplicationSignedDocumentEntity oldApplicationSignedDocument = Utils.getClonedEntityForData(applicationSignedDocument);
if(applicationSignedDocument == null) {
throw new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND));
}
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) {
+
ApplicationEntity applicationEntity = validateApplication(applicationId);
+ ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
+
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()))) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS));
}
- List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
- Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList);
- Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity);
- if (totalSteps.intValue() != completedSteps) {
- throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG));
- }
+ List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
+ Long totalSteps = flowFormDao.calculateTotalSteps(flowEdgesList);
+ Integer completedSteps = flowFormDao.getCompletedSteps(applicationEntity);
+ if (totalSteps.intValue() != completedSteps) {
+ throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG));
+ }
+
+ applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue());
+ applicationEntity = 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());
- applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue());
- applicationEntity = saveApplicationEntity(applicationEntity);
return getApplicationResponse(applicationEntity);
}
+
public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
validateAssignedUser(request, applicationId);
@@ -1125,7 +1233,7 @@ public class ApplicationDao {
try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();
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) {
String fileName = Utils.extractFileName(document.getFilePath());
@@ -1133,7 +1241,7 @@ public class ApplicationDao {
}
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();
addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
index b0bf6465..7c25401b 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
@@ -4,21 +4,22 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.*;
-import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest;
-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.request.*;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.AssignedApplicationsService;
import net.gepafin.tendermanagement.service.CallService;
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.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired;
@@ -79,13 +80,19 @@ public class ApplicationEvaluationDao {
@Autowired
ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository;
-
+
@Autowired
private FormDao formDao;
-
+
@Autowired
private AssignedApplicationsService assignedApplicationsService;
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) {
ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity();
@@ -101,6 +108,11 @@ public class ApplicationEvaluationDao {
entity.setNote(req.getNote());
entity.setMotivation(req.getMotivation());
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());
return entity;
}
@@ -135,12 +147,12 @@ public class ApplicationEvaluationDao {
response.setNote(entity.getNote());
response.setMotivation(entity.getMotivation());
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus()));
+ response.setEvaluationEndDate(entity.getEndDate());
response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate());
}
-
private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) {
List criteriaResponsesFromEntity = entity.getCriteria() != null ?
@@ -337,7 +349,7 @@ public class ApplicationEvaluationDao {
FormEntity formEntity = applicationForm.getForm();
if (formEntity != null) {
// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class);
- List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
+ List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
contentResponseBeans.forEach(contentResponseBean -> {
if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) {
String label = null;
@@ -353,7 +365,7 @@ public class ApplicationEvaluationDao {
Optional optionalFormField =
applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(
- fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId());
+ fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId());
if (optionalFormField.isPresent()) {
ApplicationFormFieldEntity formField = optionalFormField.get();
@@ -416,9 +428,8 @@ public class ApplicationEvaluationDao {
response.setBeneficiary(beneficiary);
response.setMinScore(call.getThreshold() != null ? call.getThreshold() : 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.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate);
}
@@ -431,24 +442,32 @@ public class ApplicationEvaluationDao {
Optional existingEntityOptional =
applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId);
- ApplicationEvaluationEntity entity;
+ ApplicationEvaluationEntity entity = null;
Optional assignedApplications =
assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId);
-
+ ApplicationEvaluationEntity oldApplicationEvaluation = null;
+ VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
if (existingEntityOptional.isPresent()) {
entity = existingEntityOptional.get();
+ oldApplicationEvaluation = Utils.getClonedEntityForData(entity);
entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req))));
entity.setChecklist(Utils.convertObjectToJson(filterNonNullChecklist(processChecklist(entity, req))));
entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req))));
entity.setIsDeleted(false);
setIfUpdated(entity::getNote, entity::setNote, req.getNote());
setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation());
+ actionType = VersionActionTypeEnum.UPDATE;
} else {
entity = convertToEntity(user, req, assignedApplicationId);
+ actionType = VersionActionTypeEnum.INSERT;
}
ApplicationStatusForEvaluation status = req.getApplicationStatus();
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) {
ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId());
AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get();
@@ -648,6 +667,7 @@ public class ApplicationEvaluationDao {
response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus()));
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()));
response.setMinScore(call.getThreshold()!=null?call.getThreshold():null);
+ response.setEvaluationEndDate(entity.getEndDate());
LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate);
setCriteriaResponses(entity, application.getId(), response, evaluationCriterias);
@@ -709,10 +729,10 @@ public class ApplicationEvaluationDao {
String formFieldId = criteriaFormField.getFormFieldId();
if (!mappedFieldMap.containsKey(formFieldId)) {
// CriteriaMappedField mappedField = new CriteriaMappedField();
- CriteriaMappedField mappedField = populateMappedField(formFieldId, criteriaFormField, applicationForm, applicationId);
+ CriteriaMappedField mappedField = populateMappedField(formFieldId, criteriaFormField, applicationForm, applicationId);
if(mappedField != null) {
- mappedFieldMap.put(formFieldId, mappedField);
- }
+ mappedFieldMap.put(formFieldId, mappedField);
+ }
}
}
}
@@ -721,16 +741,16 @@ public class ApplicationEvaluationDao {
}
private CriteriaMappedField populateMappedField(String formFieldId,
- CriteriaFormFieldEntity criteriaFormField,
- ApplicationFormEntity applicationForm, Long applicationId) {
- CriteriaMappedField mappedField = new CriteriaMappedField();
+ CriteriaFormFieldEntity criteriaFormField,
+ ApplicationFormEntity applicationForm, Long applicationId) {
+ CriteriaMappedField mappedField = new CriteriaMappedField();
mappedField.setId(formFieldId);
if(Boolean.FALSE.equals(criteriaFormField.getFormId().equals(applicationForm.getForm().getId()))) {
- return null;
+ return null;
}
formRepository.findById(criteriaFormField.getFormId()).ifPresent(formEntity -> {
// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class);
- List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
+ List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> {
String label = getLabel(contentResponseBean);
mappedField.setFieldName(contentResponseBean.getName());
@@ -853,7 +873,7 @@ public class ApplicationEvaluationDao {
}
private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response,
- List checklistEntities) {
+ List checklistEntities) {
List checklistResponses = entity.getChecklist() != null ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {
}) : getChecklistResponse(applicationId);
@@ -871,7 +891,7 @@ public class ApplicationEvaluationDao {
}
private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response,
- List applicationFormEntities) {
+ List applicationFormEntities) {
List fieldResponses = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {
}) : getFieldResponses(applicationId);
@@ -886,7 +906,7 @@ public class ApplicationEvaluationDao {
FormEntity formEntity = applicationForm.getForm();
if (formEntity != null) {
// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class);
- List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
+ List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
contentResponseBeans.forEach(contentResponseBean -> {
if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) {
String label = null;
@@ -902,7 +922,7 @@ public class ApplicationEvaluationDao {
Optional optionalFormField =
applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(
- fieldResponse.getId(), applicationForm.getId(), applicationId);
+ fieldResponse.getId(), applicationForm.getId(), applicationId);
if (optionalFormField.isPresent() && optionalFormField.get().getFieldValue() != null) {
String[] documentIds = optionalFormField.get().getFieldValue().split(",");
@@ -949,9 +969,8 @@ public class ApplicationEvaluationDao {
response.setBeneficiary(beneficiary);
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.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
}
private Optional findFormFieldValue(Long applicationId, String formFieldId) {
@@ -1022,7 +1041,7 @@ public class ApplicationEvaluationDao {
FormEntity formEntity = formRepository.findById(criteriaFormField.getFormId()).orElse(null);
if (formEntity != null) {
// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class);
- List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
+ List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent();
contentResponseBeans.stream()
.filter(bean -> bean.getId().equals(criteriaFormField.getFormFieldId()))
.findFirst()
@@ -1107,15 +1126,15 @@ public class ApplicationEvaluationDao {
private void handleParagraphField(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) {
findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> {
- String paragraph = contentResponseBean.getSettings().stream()
- .filter(setting -> "text".equals(setting.getName()))
- .map(SettingResponseBean::getValue)
- .map(Object::toString)
- .findFirst()
- .orElse(null);
- if (paragraph != null) {
- mappedField.setFieldValue(paragraph.trim());
- }
+ String paragraph = contentResponseBean.getSettings().stream()
+ .filter(setting -> "text".equals(setting.getName()))
+ .map(SettingResponseBean::getValue)
+ .map(Object::toString)
+ .findFirst()
+ .orElse(null);
+ if (paragraph != null) {
+ mappedField.setFieldValue(paragraph.trim());
+ }
});
}
@@ -1305,17 +1324,25 @@ public class ApplicationEvaluationDao {
public void deleteById(Long id) {
ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(id);
+ ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(applicationEvaluationEntity);
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,
- ApplicationStatusForEvaluation newStatus) {
+ ApplicationStatusForEvaluation newStatus) {
Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(
assignedApplicationsEntity.getId());
@@ -1326,8 +1353,16 @@ public class ApplicationEvaluationDao {
ApplicationEvaluationEntity existingEntity = existingEntityOptional.get();
// UserEntity userEntity = userService.validateUser(application.getUserId());
// callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId());
+ ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application);
application.setStatus(newStatus.getValue());
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();
if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) {
existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue());
@@ -1336,11 +1371,21 @@ public class ApplicationEvaluationDao {
entity = applicationEvaluationRepository.save(existingEntity);
assignedApplicationsRepository.save(assignedApplicationsEntity);
- List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId());
- for (ApplicationAmendmentRequestEntity request : amendmentRequest) {
- request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue());
+ if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.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 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())))) {
emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java
index 1617b3e7..e820297d 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java
@@ -1,21 +1,31 @@
package net.gepafin.tendermanagement.dao;
+
import jakarta.persistence.criteria.Predicate;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationEntity;
+import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity;
+import net.gepafin.tendermanagement.entities.CompanyEntity;
+import net.gepafin.tendermanagement.entities.FaqEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.AssignedApplicationEnum;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse;
+import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository;
import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository;
import net.gepafin.tendermanagement.service.ApplicationService;
+import net.gepafin.tendermanagement.service.CompanyService;
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.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
@@ -26,6 +36,7 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
import static net.gepafin.tendermanagement.util.Utils.log;
@@ -45,17 +56,30 @@ public class AssignedApplicationsDao {
@Autowired
private UserService userService;
-
+
@Autowired
private Validator validator;
+
@Autowired
private ApplicationEvaluationDao applicationEvaluationDao;
+
+ @Autowired
+ private CompanyService companyService;
- public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){
- log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId);
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
+ @Autowired
+ private ApplicationEvaluationRepository applicationEvaluationRepository;
+
+ public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) {
+ log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId);
AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null);
- if(assignedApplications!=null){
+ if (assignedApplications != null) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED));
}
ApplicationEntity application = applicationService.validateApplication(applicationId);
@@ -67,44 +91,56 @@ public class AssignedApplicationsDao {
Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS)
);
}
+ ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application);
application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue());
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);
AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest);
+ applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignment.getId());
AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment);
- applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignApplicationToInstructorResponse.getId());
log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse);
return assignApplicationToInstructorResponse;
}
- public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){
- AssignedApplicationsEntity assignApplication= new AssignedApplicationsEntity();
+ public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) {
+ AssignedApplicationsEntity assignApplication = new AssignedApplicationsEntity();
assignApplication.setApplication(application);
assignApplication.setAssignedBy(assignedByUser.getId());
assignApplication.setUserId(userId);
assignApplication.setStatus(AssignedApplicationEnum.OPEN.getValue());
- if(assignedApplicationsRequest.getStatus() != null) {
- assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue());
+ if (assignedApplicationsRequest.getStatus() != null) {
+ assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue());
}
assignApplication.setNote(assignedApplicationsRequest.getNote());
assignApplication.setIsDeleted(false);
assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
- AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication);
+
+ AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication, null, VersionActionTypeEnum.INSERT);
return assignedApplicationsEntity;
}
- public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity){
- AssignedApplicationsEntity assignedApplication= assignedApplicationsRepository.save(assignedApplicationsEntity);
+
+ public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity, AssignedApplicationsEntity oldAssignedApplicationEntity, VersionActionTypeEnum actionTypeEnum) {
+ 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;
}
- public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications){
+ public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications) {
AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse();
assignedApplicationsResponse.setId(assignedApplications.getId());
assignedApplicationsResponse.setApplicationId(assignedApplications.getApplication().getId());
ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId());
String callName = application.getCall() != null ? application.getCall().getName() : "";
+ Optional applicationEvaluationEntity=applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(application.getId());
LocalDateTime callEndDate = application.getCall().getEndDate();
LocalDateTime callStartDate = application.getCall().getStartDate();
@@ -131,27 +167,31 @@ public class AssignedApplicationsDao {
assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt());
assignedApplicationsResponse.setProtocolNumber(protocolNumber);
assignedApplicationsResponse.setCallName(callName);
- assignedApplicationsResponse.setCompanyName(application.getCompany().getCompanyName());
+ CompanyEntity company=companyService.validateCompany(application.getCompanyId());
+ assignedApplicationsResponse.setCompanyName(company.getCompanyName());
assignedApplicationsResponse.setBeneficiaryName(beneficiaryName);
assignedApplicationsResponse.setSubmissionDate(submissionDate);
assignedApplicationsResponse.setCallEndDate(callEndDate);
assignedApplicationsResponse.setCallStartDate(callStartDate);
-
+ if(applicationEvaluationEntity.isPresent()){
+ assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate());
+ }
return assignedApplicationsResponse;
}
- public AssignedApplicationsEntity validateAssignedApplication(Long id){
- AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(()->
- new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG)));
- return assignedApplication;
+ public AssignedApplicationsEntity validateAssignedApplication(Long id) {
+ AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(() ->
+ new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG)));
+ return assignedApplication;
}
public void deleteById(HttpServletRequest request, Long id) {
log.info("Deleting assigned application with ID: {}", id);
- AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id);
+ AssignedApplicationsEntity assignedApplicationsEntity = validateAssignedApplication(id);
validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId());
+ AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplicationsEntity);
assignedApplicationsEntity.setIsDeleted(true);
- assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity);
+ assignedApplicationsEntity = saveAssignedApplication(assignedApplicationsEntity, oldAssignedApplicationEntity, VersionActionTypeEnum.SOFT_DELETE);
log.info("Assigned Application deleted with ID: {}", id);
}
@@ -186,18 +226,21 @@ public class AssignedApplicationsDao {
public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request,
- Long id, AssignedApplicationsRequest updateRequest) {
- UserEntity updatedByUser = validator.validateUser(request);
+ Long id, AssignedApplicationsRequest updateRequest) {
+ UserEntity updatedByUser = validator.validateUser(request);
log.info("Updating assigned application with ID: {}", id);
AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id);
validator.validatePreInstructor(request, existingAssignment.getUserId());
+
+ AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(existingAssignment);
+
setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote());
setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name());
setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId());
existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
- AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment);
+ AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment, oldAssignedApplicationEntity, VersionActionTypeEnum.UPDATE);
AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment);
log.info("Assigned application updated successfully: {}", response);
return response;
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java
index 60f8ea20..9500e0d1 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java
@@ -2,13 +2,21 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.BeneficiaryPreferredCallEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean;
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.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
@@ -32,30 +40,45 @@ public class BeneficiaryPreferredCallDao {
@Autowired
private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository;
-
+
@Autowired
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) {
log.info("Creating new beneficiary preferred call with details: {}", request);
validator.validateUserWithCompany(httpServletRequest, request.getCompanyId());
-
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(), request.getCompanyId());
Optional existingCall = beneficiaryPreferredCallRepository
- .findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(user.getId(), request.getCallId(), request.getCompanyId());
+ .findByUserIdAndCallIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), request.getCallId(), userWithCompanyEntity.getId());
if (existingCall.isPresent()) {
log.warn("Duplicate beneficiary preferred call detected: {}", existingCall.get());
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);
+
+ /** 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());
return convertEntityToResponse(entity);
}
- private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity) {
+ private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity,UserWithCompanyEntity userWithCompanyEntity) {
BeneficiaryPreferredCallEntity entity = new BeneficiaryPreferredCallEntity();
if (userEntity.getBeneficiary()!=null) {
entity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -63,7 +86,8 @@ public class BeneficiaryPreferredCallDao {
entity.setStatus(BeneficiaryCallStatus.ENABLED.getValue());
entity.setCallId(request.getCallId());
entity.setUserId(userEntity.getId());
- entity.setCompanyId(request.getCompanyId());
+ entity.setCompanyId(userWithCompanyEntity.getCompanyId());
+ entity.setUserWithCompany(userWithCompanyEntity);
entity.setIsDeleted( false);
return entity;
}
@@ -92,13 +116,19 @@ public class BeneficiaryPreferredCallDao {
log.info("Soft deleting beneficiary preferred call with ID: {}", id);
BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id);
validator.validateUserId(request, entity.getUserId());
+ BeneficiaryPreferredCallEntity oldBeneficiaryPreferredCallEntity = Utils.getClonedEntityForData(entity);
entity.setIsDeleted(true);
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);
}
public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) {
- UserEntity userEntity = validator.validateUser(request);
+ UserEntity userEntity = validator.validateUser(request);
log.info("Fetching all beneficiary preferred calls");
List calls = beneficiaryPreferredCallRepository.findByUserIdAndIsDeletedFalse(userEntity.getId())
.stream()
@@ -122,6 +152,7 @@ public class BeneficiaryPreferredCallDao {
response.setCallId(entity.getCallId());
response.setUserId(entity.getUserId());
response.setCompanyId(entity.getCompanyId());
+ response.setUserWithCompanyId(entity.getUserWithCompany().getId());
response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate());
@@ -130,13 +161,18 @@ public class BeneficiaryPreferredCallDao {
public void updateBeneficiaryPreferredCallStatus(Long id, BeneficiaryCallStatus status) {
log.info("Updating status for beneficiary preferred call with ID: {}", id);
BeneficiaryPreferredCallEntity existingEntity = validateBeneficiaryPreferredCall(id);
+ BeneficiaryPreferredCallEntity oldBeneficiaryPreferredCallEntity = Utils.getClonedEntityForData(existingEntity);
existingEntity.setStatus(status.getValue());
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());
}
public List getBeneficiaryPreferredCallByUserId(UserEntity userEntity, Long companyId) {
-
- List calls = beneficiaryPreferredCallRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
+ List calls = beneficiaryPreferredCallRepository.findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(userEntity.getId(), userWithCompanyEntity.getId());
return calls.stream()
.map(this::convertEntityToResponse)
.collect(Collectors.toList());
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
index b19a50d2..9b3b12a5 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
@@ -15,15 +15,19 @@ import java.util.zip.ZipOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*;
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.repositories.*;
import net.gepafin.tendermanagement.service.*;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import org.h2.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import net.gepafin.tendermanagement.config.Translator;
@@ -95,15 +99,21 @@ public class CallDao {
@Autowired
private Validator validator;
+ @Autowired
+ private CompanyService companyService;
+
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) {
createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId());
CallEntity callEntity = convertToCallEntity(createCallRequest, userEntity);
updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ);
-
- convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity,
- LookUpDataTypeEnum.AIMED_TO);
+ updateLookUpData(callEntity, createCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO);
CallResponse createCallResponseBean = getCallResponseBean(callEntity);
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_1);
@@ -120,7 +130,7 @@ public class CallDao {
ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) {
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())) {
String fileName = Utils.extractFileName(document.getFilePath());
ZipEntry zipEntry = new ZipEntry(fileName);
@@ -144,7 +154,7 @@ public class CallDao {
public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) {
CallEntity callEntity = new CallEntity();
-// validateCallEntity(createCallRequest);
+ // validateCallEntity(createCallRequest);
RegionEntity region = regionRepository.findById(createCallRequest.getRegionId())
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.REGION_NOT_FOUND)));
@@ -180,6 +190,9 @@ public class CallDao {
callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime()));
callEntity.setHub(userEntity.getHub());
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;
}
@@ -197,40 +210,63 @@ public class CallDao {
List evaluationCriteriaEntities = criteriaReqList.stream()
.map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList());
- evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities);
+
return evaluationCriteriaEntities;
}
private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) {
+ EvaluationCriteriaEntity oldEvaluationCriteriaEntity = Utils.getClonedEntityForData(evaluationCriteriaEntity);
evaluationCriteriaEntity.setIsDeleted(true);
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 list = criteriaFormFieldRepository
- .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId())
- .stream()
- .peek(data -> data.setIsDeleted(Boolean.TRUE))
- .toList();
- criteriaFormFieldRepository.saveAll(list);
+ .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId());
+
+ if(Boolean.FALSE.equals(CollectionUtils.isEmpty(list))) {
+
+ 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);
+
+ }
}
private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq,
CallEntity callEntity, LookUpDataTypeEnum type) {
EvaluationCriteriaEntity criteriaEntity = null;
+ EvaluationCriteriaEntity oldCriteriaEntity = null;
+ VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(criteriaReq, type);
if (criteriaReq.getId() != null && criteriaReq.getId() > 0) {
criteriaEntity = evaluationCriteriaRepository.findById(criteriaReq.getId())
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
+ oldCriteriaEntity = Utils.getClonedEntityForData(oldCriteriaEntity);
+ actionType = VersionActionTypeEnum.UPDATE;
} else {
criteriaEntity = new EvaluationCriteriaEntity();
criteriaEntity.setCall(callEntity);
criteriaEntity.setLookupData(lookupDataEntity);
criteriaEntity.setScore(0L);
criteriaEntity.setIsDeleted(false);
+ actionType = VersionActionTypeEnum.INSERT;
}
setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore());
if (Boolean.FALSE.equals(criteriaEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) {
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;
}
@@ -251,13 +287,18 @@ public class CallDao {
.forEach(this::softDeleteDocument);
List documentEntities = documentReqList.stream()
.map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList());
- documentRepository.saveAll(documentEntities);
+// documentRepository.saveAll(documentEntities);
return documentEntities;
}
private void softDeleteDocument(DocumentEntity documentEntity) {
+ DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity);
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;
}
- public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity,
- LookUpDataEntity.LookUpDataTypeEnum type) {
- if(lookUpData == null) {
- return null;
- }
- List lookUpDataEntities = lookUpData.stream()
- .map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList());
+// public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity,
+// LookUpDataEntity.LookUpDataTypeEnum type) {
+// if(lookUpData == null) {
+// return null;
+// }
+// List lookUpDataEntities = lookUpData.stream()
+// .map(req -> lookUpDataService.getOrCreateLookUpDataEntity(req, type)).collect(Collectors.toList());
+//
+// return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities);
+// }
- return createCallTargetAudienceCheckList(callEntity, lookUpDataEntities);
- }
-
- private List createCallTargetAudienceCheckList(CallEntity callEntity,
- List lookUpDataEntities) {
- List lookUpDataResponses = new ArrayList<>();
- for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) {
- CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity();
- callTargetAudienceChecklistEntity.setIsValidated(false);
- callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity);
- callTargetAudienceChecklistEntity.setCall(callEntity);
- callTargetAudienceChecklistEntity.setIsDeleted(false);
- callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository
- .save(callTargetAudienceChecklistEntity);
- lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity));
- }
- return lookUpDataResponses;
- }
+// private List createCallTargetAudienceCheckList(CallEntity callEntity,
+// List lookUpDataEntities) {
+// List lookUpDataResponses = new ArrayList<>();
+// for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) {
+// CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity();
+// callTargetAudienceChecklistEntity.setIsValidated(false);
+// callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity);
+// callTargetAudienceChecklistEntity.setCall(callEntity);
+// callTargetAudienceChecklistEntity.setIsDeleted(false);
+// callTargetAudienceChecklistEntity = callTargetAudienceChecklistRepository
+// .save(callTargetAudienceChecklistEntity);
+// versionHistoryRequest.setOldData(null);
+// versionHistoryRequest.setNewData(callTargetAudienceChecklistEntity);
+// versionHistoryRequest.setActionType(VersionActionTypeEnum.INSERT);
+// versionHistoryRequest.setRequest(request);
+// loggingUtil.addVersionHistory(versionHistoryRequest);
+// lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity));
+// }
+// return lookUpDataResponses;
+// }
public LookUpDataResponse convertToLookUpDataResponseBean(
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) {
@@ -433,8 +479,9 @@ public class CallDao {
BeneficiaryPreferredCallEntity preferredCall;
if (companyId != null) {
validator.validateUserWithCompany(request, companyId);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
preferredCall = beneficiaryPreferredCallRepository
- .findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(userId, callId, companyId)
+ .findByUserIdAndCallIdAndUserWithCompanyIdAndIsDeletedFalse(userId, callId, userWithCompanyEntity.getId())
.orElse(null);
} else {
preferredCall = beneficiaryPreferredCallRepository
@@ -453,8 +500,14 @@ public class CallDao {
public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) {
// validateUpdate(callEntity);
- setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold());
- callRepository.save(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());
+ 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);
convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT);
@@ -463,14 +516,6 @@ public class CallDao {
updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST);
-// List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId());
-// List 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);
createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2);
return createCallResponseBean;
@@ -512,6 +557,7 @@ public class CallDao {
}
public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) {
+ CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
isValidDateRange(updateCallRequest, callEntity);
setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName());
setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort,
@@ -547,6 +593,11 @@ public class CallDao {
setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime()));
setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime()));
setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi());
+ 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);
updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ);
CallResponse createCallResponseBean = getCallResponseBean(callEntity);
@@ -555,8 +606,14 @@ public class CallDao {
}
private void softDeleteFaq(FaqEntity faqEntity) {
+
+ FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
+
faqEntity.setIsDeleted(true);
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 lookupDataReqList, LookUpDataTypeEnum type) {
@@ -576,6 +633,8 @@ public class CallDao {
private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity,
LookUpDataTypeEnum type) {
CallTargetAudienceChecklistEntity checklistEntity = null;
+ CallTargetAudienceChecklistEntity oldChecklistEntity = null;
+ VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(lookUpDataReq, type);
if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) {
checklistEntity = callTargetAudienceChecklistRepository.findById(lookUpDataReq.getId())
@@ -585,21 +644,31 @@ public class CallDao {
if (Boolean.FALSE.equals(checklistEntity.getLookupData().getId().equals(lookupDataEntity.getId()))) {
checklistEntity.setLookupData(lookupDataEntity);
}
+ oldChecklistEntity = Utils.getClonedEntityForData(checklistEntity);
+ actionType = VersionActionTypeEnum.UPDATE;
} else {
checklistEntity = new CallTargetAudienceChecklistEntity();
checklistEntity.setCall(callEntity);
checklistEntity.setLookupData(lookupDataEntity);
checklistEntity.setIsValidated(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(
CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) {
+ CallTargetAudienceChecklistEntity oldCallTargetAudienceChecklistEntity = Utils.getClonedEntityForData(callTargetAudienceChecklistEntity);
callTargetAudienceChecklistEntity.setIsDeleted(true);
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) {
@@ -670,8 +739,9 @@ public class CallDao {
if (Boolean.TRUE.equals(onlyPreferredCall)) {
validator.validateUserWithCompany(request, companyId);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
List preferredCalls = beneficiaryPreferredCallRepository
- .findByUserIdAndCompanyIdAndIsDeletedFalse(user.getId(), companyId);
+ .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId());
List preferredCallIds = preferredCalls.stream()
.map(BeneficiaryPreferredCallEntity::getCallId)
.collect(Collectors.toList());
@@ -699,10 +769,11 @@ public class CallDao {
public Map getBeneficiaryPreferredCallsForUser(HttpServletRequest request, UserEntity user, List callIds, Long companyId) {
List beneficiaryPreferredCalls;
- if (companyId != null) {
+ if (companyId != null && Boolean.TRUE.equals(validator.checkIsBeneficiary())) {
validator.validateUserWithCompany(request, companyId);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId);
beneficiaryPreferredCalls = beneficiaryPreferredCallRepository
- .findByUserIdAndCallIdInAndCompanyIdAndIsDeletedFalse(user.getId(), callIds, companyId);
+ .findByUserIdAndCallIdInAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), callIds, userWithCompanyEntity.getId());
} else {
beneficiaryPreferredCalls = beneficiaryPreferredCallRepository
.findByUserIdAndCallIdInAndIsDeletedFalse(user.getId(), callIds);
@@ -727,13 +798,18 @@ public class CallDao {
public CallResponse validateCallData(CallEntity callEntity) {
+ CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
validateUpdate(callEntity);
CallResponse callResponseBean = getCallResponseBean(callEntity);
FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId());
List formResponseBean = formDao.getFormsByCallId(callEntity);
CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean);
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.setStatus(CallStatusEnum.valueOf(callEntity.getStatus()));
return callResponseBean;
@@ -747,10 +823,15 @@ public class CallDao {
// }
public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) {
+ CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity);
CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus());
validateStatusChange(currentStatus, statusReq);
callEntity.setStatus(statusReq.getValue());
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);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java
index b752a755..d7ef7c83 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java
@@ -5,14 +5,19 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse;
import net.gepafin.tendermanagement.model.response.CommunicationResponseBean;
import net.gepafin.tendermanagement.repositories.CommunicationRepository;
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.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,24 +39,41 @@ public class CommunicationDao {
@Autowired
private Validator validator;
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationReq, Long amendmentId) {
log.info("Adding communication request...");
CommunicationEntity communicationEntity = convertToCommunicationCommentEntity(communicationReq, amendmentId);
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);
return convertToCommunicationResponseBean(communicationEntity);
}
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)));
+ //cloned for old commentData
+ CommunicationEntity oldComment = Utils.getClonedEntityForData(data);
+
if (!data.getApplicationAmendmentRequest().getId().equals(amendmentId)) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_AMENDMENT_FOR_COMMENT));
}
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.";
}
@@ -70,6 +92,9 @@ public class CommunicationDao {
log.info("Updating communication comment...");
CommunicationEntity existingComment = communicationRepository.findById(commentId)
.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)) {
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 = communicationRepository.save(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);
}
@@ -92,6 +121,7 @@ public class CommunicationDao {
response.setTitle(entity.getCommunicationTitle());
response.setSenderUserId(entity.getSenderUserId());
response.setReceiverUserId(entity.getReceiverUserId());
+ response.setId(entity.getId());
return response;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
index 84b01021..632d3226 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
@@ -1,11 +1,19 @@
package net.gepafin.tendermanagement.dao;
+import java.util.EnumSet;
import java.util.List;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*;
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.FaqRepository;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.web.rest.api.errors.*;
import org.apache.commons.lang3.StringUtils;
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.model.request.CompanyRequest;
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.util.Utils;
@@ -37,26 +43,48 @@ public class CompanyDao {
private ApplicationRepository applicationRepository;
@Autowired
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) {
+
CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId());
UserWithCompanyEntity userWithCompanyEntity = null;
if (existingCompany != null) {
- UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId())
- .orElse(null);
+ UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId()).orElse(null);
if (existingRelation == null) {
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 {
- throw new CustomValidationException(Status.VALIDATION_ERROR,
- Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY));
+ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY));
}
return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity);
} else {
validateCompany(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());
+
return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity);
}
}
@@ -80,6 +108,7 @@ public class CompanyDao {
}
private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity, Boolean isLegalRepresentant) {
+
UserWithCompanyEntity userWithCompanyEntity = new UserWithCompanyEntity();
if (userEntity.getBeneficiary() != null) {
userWithCompanyEntity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -88,7 +117,11 @@ public class CompanyDao {
userWithCompanyEntity.setCompanyId(companyEntity.getId());
userWithCompanyEntity.setUserId(userEntity.getId());
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) {
@@ -139,32 +172,43 @@ public class CompanyDao {
}
public CompanyResponse updateCompany(UserEntity userEntity, Long companyId, CompanyRequest companyRequest) {
+
CompanyEntity companyEntity = validateCompany(companyId);
- setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName,
- companyRequest.getCompanyName());
+ //cloned entity for old data
+ CompanyEntity oldCompanyData = Utils.getClonedEntityForData(companyEntity);
+
+ setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName, companyRequest.getCompanyName());
setIfUpdated(companyEntity::getVatNumber, companyEntity::setVatNumber, companyRequest.getVatNumber());
- setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale,
- companyRequest.getCodiceFiscale());
+ setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale, companyRequest.getCodiceFiscale());
setIfUpdated(companyEntity::getAddress, companyEntity::setAddress, companyRequest.getAddress());
- setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber,
- companyRequest.getPhoneNumber());
+ setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber, companyRequest.getPhoneNumber());
setIfUpdated(companyEntity::getCity, companyEntity::setCity, companyRequest.getCity());
setIfUpdated(companyEntity::getProvince, companyEntity::setProvince, companyRequest.getProvince());
setIfUpdated(companyEntity::getCap, companyEntity::setCap, companyRequest.getCap());
setIfUpdated(companyEntity::getCountry, companyEntity::setCountry, companyRequest.getCountry());
setIfUpdated(companyEntity::getPec, companyEntity::setPec, companyRequest.getPec());
setIfUpdated(companyEntity::getEmail, companyEntity::setEmail, companyRequest.getEmail());
- setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees,
- companyRequest.getNumberOfEmployees());
- setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue,
- companyRequest.getAnnualRevenue());
- setIfUpdated(companyEntity::getContactName,companyEntity::setContactName,companyRequest.getContactName());
- setIfUpdated(companyEntity::getContactEmail,companyEntity::setContactEmail,companyRequest.getContactEmail());
+ setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees, companyRequest.getNumberOfEmployees());
+ setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue, companyRequest.getAnnualRevenue());
+ setIfUpdated(companyEntity::getContactName, companyEntity::setContactName, companyRequest.getContactName());
+ setIfUpdated(companyEntity::getContactEmail, companyEntity::setContactEmail, companyRequest.getContactEmail());
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);
- Utils.setIfUpdated(userWithCompanyEntity::getIsLegalRepresentant, userWithCompanyEntity::setIsLegalRepresentant,
- companyRequest.getIsLegalRepresentant());
- userWithCompanyRepository.save(userWithCompanyEntity);
+ //cloned entity for old data
+ UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(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);
}
@@ -179,8 +223,20 @@ public class CompanyDao {
}
public void deleteCompany(UserEntity userEntity, Long 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);
+
+ 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);
}
@@ -200,30 +256,75 @@ public class CompanyDao {
}
public UserWithCompanyEntity getUserWithCompany(Long userId, Long compnayId) {
- return userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userId, compnayId).orElseThrow(
- () -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_COMPANY_RELATION_NOT_FOUND)));
- }
- public void removeCompanyFromList(UserEntity userEntity, Long companyId) {
- CompanyEntity companyEntity = validateCompany(companyId);
- UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyEntity.getId())
- .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.USER_ALREADY_CONNECTED_TO_COMPANY)));
- List userApplications = applicationRepository.findByCompanyIdAndUserIdAndIsDeletedFalse(companyEntity.getId(), userEntity.getId());
- List faqs = faqRepository.findByCompanyIdAndUserIdAndIsDeletedFalse(companyEntity.getId(), userEntity.getId());
- for (ApplicationEntity application : userApplications) {
- if(Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) {
- throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT));
+ return userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userId, compnayId).orElseThrow(
+ () -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_COMPANY_RELATION_NOT_FOUND)));
+ }
+ public void removeCompanyFromList(UserEntity userEntity, Long companyId) {
+ CompanyEntity companyEntity = validateCompany(companyId);
+ UserWithCompanyEntity existingRelation=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId());
+ List userApplications = applicationRepository.findByUserWithCompanyIdAndUserIdAndIsDeletedFalse(existingRelation.getId(), userEntity.getId());
+ List faqs = faqRepository.findByUserWithCompanyIdAndIsDeletedFalse(existingRelation.getId());
+ List preferredCallEntities= beneficiaryPreferredCallRepository.findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(userEntity.getId(),existingRelation.getId());
+ UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository.findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(),existingRelation.getId(), UserCompanyDelegationStatusEnum.ACTIVE.getValue());
+ List 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));
}
- if(Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) {
+
+ for(ApplicationEntity application:userApplications){
+ ApplicationEntity oldApplication = Utils.getClonedEntityForData(application);
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){
+ FaqEntity oldFaq = Utils.getClonedEntityForData(faq);
+ faq.setIsDeleted(Boolean.TRUE);
+
+ /** 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());
}
- for(FaqEntity faq:faqs) {
- faq.setIsDeleted(Boolean.TRUE);
- faqRepository.save(faq);
- }
+ UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(existingRelation);
existingRelation.setIsDeleted(Boolean.TRUE);
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());
}
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java
index c76d14c9..0afc8fc8 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java
@@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.entities.CompanyEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
+import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import net.gepafin.tendermanagement.enums.CallStatusEnum;
import net.gepafin.tendermanagement.enums.RoleStatusEnum;
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.CompanyRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
+import net.gepafin.tendermanagement.service.CompanyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -31,6 +33,9 @@ public class DashboardDao {
@Autowired
private CompanyRepository companyRepository;
+
+ @Autowired
+ private CompanyService companyService;
public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) {
SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean();
@@ -108,8 +113,9 @@ public class DashboardDao {
if (activeCalls != null) {
beneficiaryWidgetResponseBean.setNumberOfCalls(activeCalls);
}
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),company.getId());
Long activeApplication = applicationRepository.countSubmittedApplicationsByUserId(userEntity.getId(),
- company.getId());
+ userWithCompanyEntity.getId());
if (activeApplication != null) {
beneficiaryWidgetResponseBean.setNumberOfApplications(activeApplication);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java
index dfc65ec7..f5006e2f 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java
@@ -5,10 +5,17 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.function.Function;
+import net.gepafin.tendermanagement.entities.*;
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.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,10 +25,6 @@ import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
-import net.gepafin.tendermanagement.entities.CompanyEntity;
-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.model.request.CompanyDelegationRequest;
import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse;
@@ -67,9 +70,21 @@ public class DelegationDao {
@Autowired
private Validator validator;
+ @Autowired
+ private UserWithCompanyRepository userWithCompanyRepository;
+
+ @Autowired
+ private CompanyService companyService;
+
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) {
try {
- String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L);
+ String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L);
InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName);
XWPFDocument doc = loadTemplate(templateStream);
replacePlaceholders(doc, placeholders);
@@ -176,22 +191,24 @@ public class DelegationDao {
placeholders.put(key, formatter.apply(value));
}
}
-
public CompanyDelegationResponse uploadCompanyDelegation(UserEntity userEntity, Long companyId, MultipartFile file) {
+
companyDao.validateCompany(companyId);
companyDao.getUserWithCompany(userEntity.getId(), companyId);
validateFileType(file);
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
- .findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId,
+ .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue());
+
if (userCompanyDelegationEntity != null) {
- userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue());
- userCompanyDelegationRepository.save(userCompanyDelegationEntity);
+ deleteDelegationFromS3(userCompanyDelegationEntity);
}
UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3ForCompanyDelegation(file);
userCompanyDelegationEntity = new UserCompanyDelegationEntity();
- userCompanyDelegationEntity.setCompanyId(companyId);
+ userCompanyDelegationEntity.setUserWithCompany(userWithCompanyEntity);
+ userCompanyDelegationEntity.setCompanyId(userWithCompanyEntity.getCompanyId());
userCompanyDelegationEntity.setUserId(userEntity.getId());
if (userEntity.getBeneficiary() != null) {
userCompanyDelegationEntity.setBeneficiaryId(userEntity.getBeneficiary().getId());
@@ -200,8 +217,14 @@ public class DelegationDao {
userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3Response.getFileName());
userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath());
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);
}
+
private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForCompanyDelegation(MultipartFile file) {
try {
String s3Path = generateS3PathForDelegation();
@@ -235,8 +258,9 @@ public class DelegationDao {
}
public CompanyDelegationResponse getCompanyDelegation(UserEntity userEntity, Long companyId) {
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
- .findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId,
+ .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue());
companyDao.getUserWithCompany(userEntity.getId(), companyId);
if(userCompanyDelegationEntity == null) {
@@ -247,15 +271,30 @@ public class DelegationDao {
}
public void deleteCompanyDelegation(UserEntity userEntity, Long companyId) {
+ UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository
- .findByUserIdAndCompanyIdAndStatus(userEntity.getId(), companyId,
+ .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(),
UserCompanyDelegationStatusEnum.ACTIVE.getValue());
companyDao.getUserWithCompany(userEntity.getId(), companyId);
- if(userCompanyDelegationEntity == null) {
- throw new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.DELEGATION_NOT_FOUND));
+
+ if (userCompanyDelegationEntity == null) {
+ throw new ResourceNotFoundException(Status.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());
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());
}
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java
index 4f0f3144..b23e4785 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java
@@ -1,10 +1,14 @@
package net.gepafin.tendermanagement.dao;
+import lombok.extern.slf4j.Slf4j;
import java.util.stream.Collectors;
-import lombok.extern.slf4j.Slf4j;
-import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
+import jakarta.servlet.http.HttpServletRequest;
+import net.gepafin.tendermanagement.enums.*;
+import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
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 org.springframework.beans.factory.annotation.Autowired;
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.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.CallEntity;
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.UploadFileOnAmazonS3Response;
+import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.DocumentRepository;
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.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
-
+import org.springframework.beans.factory.annotation.Value;
import java.util.ArrayList;
import java.util.List;
+
@Slf4j
@Component
public class DocumentDao {
@@ -47,11 +55,30 @@ public class DocumentDao {
@Autowired
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}")
// private String s3Folder;
public List uploadFiles(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) {
+
List documentEntities = new ArrayList<>();
Long source = resolveSourceId(sourceId, sourceType);
for (MultipartFile file : files) {
@@ -68,55 +95,117 @@ public class DocumentDao {
}
}
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());
}
+
+ 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) {
- Long applicationId = 0L;
+ Long applicationId = 0L;
+ Long amendmentId = 0L;
Long callId = sourceId;
if (type == DocumentSourceTypeEnum.APPLICATION) {
applicationId = sourceId;
callId = applicationFormRepository.findCallIdById(applicationId);
+ } else if (type == DocumentSourceTypeEnum.AMENDMENT) {
+ amendmentId = sourceId;
+ ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId);
+ applicationId = applicationEntity.getId();
+ callId = applicationEntity.getCall().getId();
}
try {
- String s3Path = generateS3Path(type, callId, applicationId);
+ String s3Path = generateS3Path(type, callId, applicationId, amendmentId);
log.info("Generated S3 path {}", s3Path);
return amazonS3Service.uploadFileOnAmazonS3(s3Path, file);
} catch (Exception e) {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3));
}
}
- public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId) {
+ public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId) {
try {
- return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId);
+ return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId);
} catch (IllegalArgumentException e) {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG));
}
}
+
private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) {
+
if (sourceType == DocumentSourceTypeEnum.CALL) {
CallEntity callEntity = callService.validateCall(sourceId);
-// callDao.validateUpdate(callEntity);
+ // callDao.validateUpdate(callEntity);
return callEntity.getId();
}
-// else if (sourceType == SourceTypeEnum.APPLICATION) {
-// ApplicationEntity applicationEntity = applicationService.validateApplication(sourceId);
-// return applicationEntity.getId(); // Assuming ApplicationEntity has getId()
-// }
-//
+ // else if (sourceType == SourceTypeEnum.APPLICATION) {
+ // ApplicationEntity applicationEntity = applicationService.validateApplication(sourceId);
+ // return applicationEntity.getId(); // Assuming ApplicationEntity has getId()
+ // }
+ //
return sourceId;
}
public void deleteFile(Long documentId) {
- DocumentEntity documentEntity = documentRepository.findById(documentId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)));
-// String fileName= Utils.extractFileName(documentEntity.getFilePath());
-// deleteFileOnAmazonS3(fileName);
- documentEntity.setIsDeleted(true);
- documentRepository.save(documentEntity);
- }
+ DocumentEntity documentEntity = documentRepository.findById(documentId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)));
+ if(Boolean.TRUE.equals(documentEntity.getIsDeleted())){
+ return;
+ }
+ 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) {
return documentRepository.findByIdAndNotDeleted(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
@@ -124,32 +213,49 @@ public class DocumentDao {
}
public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) {
+
DocumentEntity documentEntity = validateDocument(documentId);
+ //cloned entity for old data
+ DocumentEntity oldDocumentData = Utils.getClonedEntityForData(documentEntity);
+
String type = documentEntity.getSource();
UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId());
- if (uploadFileOnAmazonS3Response != null) {
+ if (uploadFileOnAmazonS3Response != null) {
documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName());
documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath());
documentEntity.setType(documentTypeEnum.getValue());
documentEntity.setSource(documentEntity.getSource());
documentEntity.setSourceId(documentEntity.getSourceId());
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);
}
+
private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) {
try {
- Long callId;
- Long applicationId;
- if(type.equals(DocumentSourceTypeEnum.APPLICATION)){
+ Long callId=null;
+ Long applicationId=null;
+ Long amendmentId=null;
+ if (type.equals(DocumentSourceTypeEnum.APPLICATION)) {
callId = applicationFormRepository.findCallIdById(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;
applicationId = 0L;
}
- String s3Path = generateS3Path(type, callId, applicationId);
+ String s3Path = generateS3Path(type, callId, applicationId,amendmentId);
log.info("Generated S3 path {}", s3Path);
return amazonS3Service.uploadFileOnAmazonS3(s3Path, file);
} catch (Exception e) {
@@ -160,4 +266,26 @@ public class DocumentDao {
DocumentEntity documentEntity = validateDocument(documentId);
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.");
+ }
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java
index 5775daf1..d74a6b3f 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailLogDao.java
@@ -1,12 +1,16 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.EmailLogEntity;
import net.gepafin.tendermanagement.enums.EmailScenarioTypeEnum;
import net.gepafin.tendermanagement.enums.EmailEntityTypeEnum;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.repositories.EmailLogRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,8 +23,9 @@ public class EmailLogDao {
private EmailLogRepository emailLogRepository;
- public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest){
- EmailLogEntity emailLogEntity=new EmailLogEntity();
+ public EmailLogEntity createEmailLog(EmailLogRequest emailLogRequest) {
+
+ EmailLogEntity emailLogEntity = new EmailLogEntity();
emailLogEntity.setEmailType(emailLogRequest.getEmailType().getValue());
emailLogEntity.setRecipientType(emailLogRequest.getRecipientType().getValue());
emailLogEntity.setRecipientId(emailLogRequest.getRecipientId());
@@ -34,10 +39,11 @@ public class EmailLogDao {
emailLogEntity.setRecipientEmails(emailLogRequest.getRecipientEmails());
emailLogEntity.setEmailServiceType(emailLogRequest.getEmailServiceType().getValue());
emailLogEntity.setIsDeleted(false);
- emailLogEntity.setApplicationId(emailLogRequest.getApplicatioId());
- emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId());
- emailLogEntity.setCallId(emailLogRequest.getCallId());
- emailLogEntity=saveEmailLogEntity(emailLogEntity);
+ emailLogEntity.setApplicationId(emailLogRequest.getApplicatioId());
+ emailLogEntity.setAmendmentId(emailLogRequest.getAmendmentId());
+ emailLogEntity.setCallId(emailLogRequest.getCallId());
+ emailLogEntity = saveEmailLogEntity(emailLogEntity);
+
return emailLogEntity;
}
public EmailLogEntity saveEmailLogEntity(EmailLogEntity emailLogEntity){
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java
index 1b390556..4bf99110 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java
@@ -79,7 +79,7 @@ public class EmailNotificationDao {
SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, hubEntity, null);
Map 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("{{company_name}}", company.getCompanyName());
// bodyPlaceholders.put("{{legal_mail}}", legalMail);
@@ -91,7 +91,7 @@ public class EmailNotificationDao {
private void sendEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List additionalRecipients,Long amendmentId,SystemEmailTemplateResponse systemEmailTemplateResponse,String subject,String body) {
Optional applicationEvaluationEntity = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationEntity.getId());
- CompanyEntity company = companyService.validateCompany(applicationEntity.getCompany().getId());
+ CompanyEntity company = companyService.validateCompany(applicationEntity.getCompanyId());
String companyEmail = company.getEmail();
String contactEmail = company.getContactEmail();
@@ -258,6 +258,7 @@ public class EmailNotificationDao {
EmailConfig emailConfig = retrieveEmailConfig(hubId);
EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType());
emailService.sendEmail(subject, body, recipientEmails, emailConfig,emailLogRequest);
+// emailService.sendEmail(subject, body, recipientEmails, emailConfig);
}
public EmailConfig retrieveEmailConfig(Long hubId) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java
index 86a7693f..8f7897c4 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java
@@ -1,17 +1,22 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity;
import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean;
import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository;
import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository;
import net.gepafin.tendermanagement.service.CallService;
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.Status;
@@ -35,72 +40,109 @@ public class EvaluationCriteriaDao {
@Autowired
private CriteriaFormFieldRepository criteriaFormFieldRepository;
- public EvaluationCriteriaResponseBean createEvaluationCriteria(
- EvaluationCriteriaRequest evaluationCriteriaRequest) {
- EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(
- evaluationCriteriaRequest);
- return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
- }
+ @Autowired
+ private LoggingUtil loggingUtil;
- private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(
- EvaluationCriteriaRequest evaluationCriteriaRequest) {
- EvaluationCriteriaEntity entity = new EvaluationCriteriaEntity();
- CallEntity callEntity = callService.validateCall(evaluationCriteriaRequest.getCallId());
- LookUpDataEntity looDataEntity = lookUpDataService
- .validateLookUpData(evaluationCriteriaRequest.getLookUpDataId());
- entity.setCall(callEntity);
- entity.setLookupData(looDataEntity);
- entity.setScore(0L);
- if (evaluationCriteriaRequest.getScore() != null) {
- entity.setScore(evaluationCriteriaRequest.getScore());
- }
- entity = evaluationCriteriaRepository.save(entity);
- return entity;
- }
+ @Autowired
+ private HttpServletRequest request;
- public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) {
- return evaluationCriteriaRepository.findById(id)
- .map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean)
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
- }
-
- public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) {
- return evaluationCriteriaRepository.findById(id)
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
- }
+ public EvaluationCriteriaResponseBean createEvaluationCriteria(EvaluationCriteriaRequest evaluationCriteriaRequest) {
- public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) {
- EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id)
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
- entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(request);
- return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
- }
+ EvaluationCriteriaEntity entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.INSERT, null);
+ return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
+ }
- public void deleteEvaluationCriteria(Long id) {
- evaluationCriteriaRepository.deleteById(id);
- EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id);
- evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE);
- evaluationCriteriaRepository.save(evaluationCriteriaEntity);
- List list = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId())
- .stream()
- .peek(data -> data.setIsDeleted(Boolean.TRUE))
- .toList();;
- criteriaFormFieldRepository.saveAll(list);
- }
+ private EvaluationCriteriaEntity convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(EvaluationCriteriaRequest evaluationCriteriaRequest,
+ VersionActionTypeEnum actionType, EvaluationCriteriaEntity evaluationCriteriaEntity) {
- private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(
- EvaluationCriteriaEntity entity) {
- EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean();
- response.setId(entity.getId());
- response.setScore(entity.getScore());
- response.setCreatedDate(entity.getCreatedDate());
- response.setUpdatedDate(entity.getUpdatedDate());
- response.setLookUpDataId(entity.getLookupData().getId());
- response.setTitle(entity.getLookupData().getTitle());
- response.setValue(entity.getLookupData().getValue());
- return response;
- }
+ 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());
+ LookUpDataEntity lookupDataEntity = lookUpDataService.getOrCreateLookUpDataEntity(evaluationCriteriaRequest, LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA);
+ entity.setCall(callEntity);
+ entity.setLookupData(lookupDataEntity);
+ entity.setScore(0L);
+ if (evaluationCriteriaRequest.getScore() != null) {
+ entity.setScore(evaluationCriteriaRequest.getScore());
+ }
+ 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;
+ }
+
+ public EvaluationCriteriaResponseBean getEvaluationCriteriaById(Long id) {
+
+ return evaluationCriteriaRepository.findById(id).map(this::convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean)
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
+ }
+
+ public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) {
+
+ return evaluationCriteriaRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
+ }
+
+ public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest evaluationCriteriaRequest) {
+
+ EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)));
+
+ entity = convertEvaluationCriteriaRequestToEvaluationCriteriaEntity(evaluationCriteriaRequest, VersionActionTypeEnum.UPDATE, entity);
+ return convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean(entity);
+ }
+
+ public void deleteEvaluationCriteria(Long id) {
+ // evaluationCriteriaRepository.deleteById(id); // Not needed if setting isDeleted TRUE in the next line after fetching evaluation criteria
+ EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id);
+
+ // Clone the evaluation criteria entity for old data
+ EvaluationCriteriaEntity oldEvaluationCriteriaData = Utils.getClonedEntityForData(evaluationCriteriaEntity);
+
+ List oldList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream()
+ .map(Utils::getClonedEntityForData).toList();
+
+ evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE);
+ evaluationCriteriaEntity = evaluationCriteriaRepository.save(evaluationCriteriaEntity);
+
+ /** This code is responsible for adding a version history log for the "updating evaluation criteria" operation. **/
+ loggingUtil.addVersionHistory(
+ VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldEvaluationCriteriaData).newData(evaluationCriteriaEntity)
+ .build());
+
+ List updatedList = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()).stream()
+ .peek(data -> data.setIsDeleted(Boolean.TRUE)).toList();
+
+ List 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(EvaluationCriteriaEntity entity) {
+
+ EvaluationCriteriaResponseBean response = new EvaluationCriteriaResponseBean();
+ response.setId(entity.getId());
+ response.setScore(entity.getScore());
+ response.setCreatedDate(entity.getCreatedDate());
+ response.setUpdatedDate(entity.getUpdatedDate());
+ response.setLookUpDataId(entity.getLookupData().getId());
+ response.setTitle(entity.getLookupData().getTitle());
+ response.setValue(entity.getLookupData().getValue());
+ return response;
+ }
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
index cfec2fe2..e5a41e68 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java
@@ -1,20 +1,26 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.FaqEntity;
-import net.gepafin.tendermanagement.entities.LookUpDataEntity;
import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.RoleStatusEnum;
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.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.FaqResponseBean;
import net.gepafin.tendermanagement.repositories.FaqRepository;
+import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.LookUpDataService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
+import net.gepafin.tendermanagement.util.LoggingUtil;
+import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
@@ -26,6 +32,7 @@ import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
import java.time.LocalDateTime;
import java.util.List;
+import java.util.Optional;
@Component
public class FaqDao {
@@ -44,20 +51,39 @@ public class FaqDao {
@Autowired
private CompanyService companyService;
+
+ @Autowired
+ private UserWithCompanyRepository userWithCompanyRepository;
+
+ @Autowired
+ HttpServletRequest request;
+
+ @Autowired
+ LoggingUtil loggingUtil;
public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) {
+
CallEntity callEntity = callService.validateCall(callId);
- FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity,
- LookUpDataEntity.LookUpDataTypeEnum.FAQ);
+ FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataTypeEnum.FAQ);
+ FaqEntity oldFaqEntity = Utils.getClonedEntityForData(entity);
if (validator.checkIsBeneficiary() && companyId == null) {
- throw new CustomValidationException(Status.VALIDATION_ERROR,
- Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY));
+ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY));
}
- if(companyId!=null) {
- companyService.validateCompany(companyId);
- entity.setCompanyId(companyId);
+ UserWithCompanyEntity userWithCompanyEntity=null;
+ if(companyId!=null) {
+ userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId);
+ companyService.validateCompany(userWithCompanyEntity.getCompanyId());
+ entity.setCompanyId(userWithCompanyEntity.getCompanyId());
+
}
+
+ entity.setUserWithCompany(userWithCompanyEntity);
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);
}
@@ -68,14 +94,20 @@ public class FaqDao {
public FaqResponseBean updateFaq(Long id, FaqReq faqRequest, UserEntity userEntity) {
FaqEntity entity = validateFaq(id);
faqRequest.setId(entity.getId());
- createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ);
+ createOrUpdateFaqEntity(faqRequest, entity.getCall(), userEntity, LookUpDataTypeEnum.FAQ);
return convertToFaqResponseBean(entity);
}
public void deleteFaq(Long id) {
+
FaqEntity faqEntity = validateFaq(id);
+ FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
faqEntity.setIsDeleted(Boolean.TRUE);
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) {
@@ -89,14 +121,16 @@ public class FaqDao {
.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 oldFaqEntity = null;
+ VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT;
if (isExistingFaq(faqReq)) {
faqEntity = faqRepository.findByIdAndCallIdAndIsDeletedFalse(faqReq.getId(), callEntity.getId())
- .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
- Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND)));
+ .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.FAQ_NOT_FOUND)));
+ oldFaqEntity = Utils.getClonedEntityForData(faqEntity);
+ actionType = VersionActionTypeEnum.UPDATE;
} else {
if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) {
lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type);
@@ -106,16 +140,20 @@ public class FaqDao {
faqEntity.setUser(userEntity);
faqEntity.setIsVisible(false);
faqEntity.setIsDeleted(false);
+ actionType = VersionActionTypeEnum.INSERT;
}
- if (faqReq.getResponse() != null && (faqEntity.getResponse() == null
- || Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) {
+ if (faqReq.getResponse() != null && (faqEntity.getResponse() == null || Boolean.FALSE.equals(faqReq.getResponse().equals(faqEntity.getResponse())))) {
faqEntity.setResponseDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
}
setIfUpdated(faqEntity::getTitle, faqEntity::setTitle, faqReq.getTitle());
setIfUpdated(faqEntity::getValue, faqEntity::setValue, faqReq.getValue());
setIfUpdated(faqEntity::getResponse, faqEntity::setResponse, faqReq.getResponse());
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) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
index b4db5ff5..c298cbd4 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java
@@ -6,9 +6,11 @@ import net.gepafin.tendermanagement.entities.CallEntity;
import net.gepafin.tendermanagement.entities.FlowDataEntity;
import net.gepafin.tendermanagement.entities.FlowEdgesEntity;
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.FlowEdgesRequestBean;
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.FlowEdgesResponseBean;
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.util.DateTimeUtil;
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.Status;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import com.itextpdf.text.pdf.PdfStructTreeController.returnType;
+
+import jakarta.servlet.http.HttpServletRequest;
+
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@@ -47,7 +55,10 @@ public class FlowDao {
private FormService formService;
@Autowired
- private CallDao callDao;
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
public FlowResponseBean createOrUpdateFlow(FlowRequestBean flowRequestBean, Long callId) {
validateFlowRequestBean(flowRequestBean);
@@ -76,11 +87,43 @@ public class FlowDao {
List flowDataEntities = flowDataRepository.findByCallId(call.getId());
List flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId());
if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) {
- call.setInitialForm(null);
- call.setFinalForm(null);
- call=callRepository.save(call);
+ if (call.getInitialForm() != null || call.getInitialForm() != null) {
+ CallEntity oldCallEntity = Utils.getClonedEntityForData(call);
+ call.setInitialForm(null);
+ call.setFinalForm(null);
+ 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);
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());
+
+ });
+
+
}
}
@@ -110,20 +153,38 @@ public class FlowDao {
return flowResponseBean;
}
- private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, CallEntity call) {
- call.setInitialForm(flowRequestBean.getInitialForm());
- call.setFinalForm(flowRequestBean.getFinalForm());
- call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
- call = callRepository.save(call);
- return call;
- }
+ private CallEntity setInitialAndFinalFormInCall(FlowRequestBean flowRequestBean, CallEntity call) {
+
+ CallEntity oldCallEntity = Utils.getClonedEntityForData(call);
+ call.setInitialForm(flowRequestBean.getInitialForm());
+ call.setFinalForm(flowRequestBean.getFinalForm());
+ call.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
+ 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;
+ }
public List createFlowData(FlowRequestBean flowRequestBean, CallEntity call) {
if (flowRequestBean.getFlowData() != null || !flowRequestBean.getFlowEdges().isEmpty()) {
List flowDataEntities = flowRequestBean.getFlowData().stream()
.map(flowDataRequestBean -> createFlowDataEntity(flowDataRequestBean, call))
.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;
}
@@ -145,7 +206,16 @@ public class FlowDao {
List flowEdgesEntities = flowRequestBean.getFlowEdges().stream()
.map(flowEdgesRequestBean -> createFlowEdgesEntity(flowEdgesRequestBean, call))
.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) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
index 4ad912f4..4a42daf7 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
@@ -3,19 +3,15 @@ package net.gepafin.tendermanagement.dao;
import java.util.*;
import java.util.stream.Collectors;
+import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.repositories.*;
+import net.gepafin.tendermanagement.service.CompanyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.gepafin.tendermanagement.config.Translator;
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.model.response.NextOrPreviousFormResponse;
import net.gepafin.tendermanagement.service.FormService;
@@ -44,6 +40,8 @@ public class FlowFormDao {
private FormService formService;
@Autowired
private FormDao formDao;
+ @Autowired
+ private CompanyService companyService;
@@ -290,6 +288,7 @@ public class FlowFormDao {
private NextOrPreviousFormResponse setNextOrPreviousResponse(Long calculatedFormId, ApplicationEntity applicationEntity) {
NextOrPreviousFormResponse nextOrPreviousFormResponse = new NextOrPreviousFormResponse();
Integer completedSteps=0;
+ CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId());
FormEntity formEntity = formService.validateForm(calculatedFormId);
nextOrPreviousFormResponse.setFormId(calculatedFormId);
nextOrPreviousFormResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(applicationEntity.getStatus()));
@@ -297,8 +296,8 @@ public class FlowFormDao {
applicationDao.processForm(formEntity, applicationEntity));
nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId());
nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName());
- nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompany().getId());
- nextOrPreviousFormResponse.setCompanyName(applicationEntity.getCompany().getCompanyName());
+ nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompanyId());
+ nextOrPreviousFormResponse.setCompanyName(company.getCompanyName());
List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId());
Long totalFormSteps = calculateTotalSteps(flowEdgesList);
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
index c315cfe6..9e85a843 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java
@@ -1,8 +1,10 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
+import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.response.ContentResponseBean;
import net.gepafin.tendermanagement.model.response.FormResponseBean;
@@ -10,6 +12,7 @@ import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.EvaluationCriteriaService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.FieldValidator;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -62,19 +65,31 @@ public class FormDao {
@Autowired
private EvaluationCriteriaService evaluationCriteriaService;
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
public FormEntity saveFormEntity(FormEntity formEntity){
formEntity=formRepository.save(formEntity);
return formEntity;
}
- public FormEntity convertFormRequestToFormEntity(CallEntity callEntity, FormRequest formRequest){
- FormEntity formEntity=new FormEntity();
+ public FormEntity convertFormRequestToFormEntity(CallEntity callEntity, FormRequest formRequest) {
+
+ FormEntity formEntity = new FormEntity();
formEntity.setCall(callEntity);
formEntity.setLabel(formRequest.getLabel());
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;
}
+
public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity) {
FormResponseBean formResponseBean=new FormResponseBean();
formResponseBean.setId(formEntity.getId());
@@ -97,18 +112,35 @@ public class FormDao {
return contentList;
}
- public FormResponseBean createForm(CallEntity callEntity,FormRequest formRequest){
+ public FormResponseBean createForm(CallEntity callEntity, FormRequest formRequest) {
+
validateForm(formRequest);
- List flowDataEntities=flowDataRepository.findByCallId(callEntity.getId());
- List flowEdgesEntities=flowEdgesRepository.findByCallId(callEntity.getId());
- if(Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities==null ) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities==null) ){
+ //cloned entity for old call data.
+ CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
+
+ List flowDataEntities = flowDataRepository.findByCallId(callEntity.getId());
+ List flowEdgesEntities = flowEdgesRepository.findByCallId(callEntity.getId());
+ if (Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities == null) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities == null)) {
+
+ /** 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);
flowEdgesRepository.deleteAll(flowEdgesEntities);
callEntity.setInitialForm(null);
callEntity.setFinalForm(null);
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());
return convertFormEntityToFormResponseBean(formEntity);
}
@@ -134,10 +166,25 @@ public class FormDao {
.filter(criteriaId -> !existingEvaluationCriteriaIds.contains(criteriaId))
.forEach(criteriaId -> createCriteriaFormField(callEntity, formEntity, content.getId(), criteriaId));
+ // Prepare entities to be marked as deleted
List toBeDeleted = existingCriteriaFields.stream()
- .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId()))
- .peek(data->data.setIsDeleted(Boolean.TRUE))
- .collect(Collectors.toList());
+ .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId()))
+ .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());
if (!toBeDeleted.isEmpty()) {
criteriaFormFieldRepository.saveAll(toBeDeleted);
@@ -146,6 +193,7 @@ public class FormDao {
}
+
private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity,
String formFieldId,Long evaluationCriteriaId) {
EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId);
@@ -160,6 +208,9 @@ public class FormDao {
criteriaFormField.setIsDeleted(Boolean.FALSE);
criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId);
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());
}
@@ -168,74 +219,108 @@ public class FormDao {
throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM));
}
}
- public FormResponseBean updateForm(UserEntity user, Long formId, FormRequest formRequest,Boolean forceDeleteFlow){
- ContentRequestBean contentRequestBean2=null;
- String choosenField=null;
+ public FormResponseBean updateForm(UserEntity user, Long formId, FormRequest formRequest, Boolean forceDeleteFlow) {
+
+ ContentRequestBean contentRequestBean2 = null;
+ String choosenField = null;
FormEntity formEntity = validateForm(formId);
+ //cloned for old form data
+ FormEntity oldFormData = Utils.getClonedEntityForData(formEntity);
+
validator.validateUserWithCall(user, formEntity.getCall().getId());
-// callDao.validateUpdate(formEntity.getCall());
- List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class);
- for (ContentRequestBean contentRequestBean1 : contentRequestBean) {
- FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId());
- if (flowDataEntity != null) {
- choosenField = flowDataEntity.getChoosenField();
- if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) {
- contentRequestBean2 = contentRequestBean1;
- break;
- }
+ // callDao.validateUpdate(formEntity.getCall());
+ List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class);
+ for (ContentRequestBean contentRequestBean1 : contentRequestBean) {
+ FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId());
+ if (flowDataEntity != null) {
+ choosenField = flowDataEntity.getChoosenField();
+ if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) {
+ contentRequestBean2 = contentRequestBean1;
+ break;
}
}
- if (contentRequestBean2 != null) {
- List settingRequestBeansDB = contentRequestBean2.getSettings();
- for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) {
- if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) {
- for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) {
- for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) {
- if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) {
- if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) {
- if (Boolean.TRUE.equals(forceDeleteFlow)) {
- Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
- Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
- formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
- formEntity = saveFormEntity(formEntity);
- List flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId());
- List flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId());
- flowDataRepository.deleteAll(flowDataEntities);
- flowEdgesRepository.deleteAll(flowEdgesEntities);
- CallEntity callEntity = formEntity.getCall();
- callEntity.setInitialForm(null);
- callEntity.setFinalForm(null);
- callRepository.save(callEntity);
- return convertFormEntityToFormResponseBean(formEntity);
- } else {
- throw new CustomValidationException(
- Status.BAD_REQUEST,
- Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField)
- );
- }
- }
- else {
+ }
+ if (contentRequestBean2 != null) {
+ List settingRequestBeansDB = contentRequestBean2.getSettings();
+ for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) {
+ if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) {
+ for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) {
+ for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) {
+ if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) {
+ if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) {
+ if (Boolean.TRUE.equals(forceDeleteFlow)) {
Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
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 flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId());
+ List 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);
+ flowEdgesRepository.deleteAll(flowEdgesEntities);
+ CallEntity callEntity = formEntity.getCall();
+ //cloned for oldCall data
+ CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
+
+ callEntity.setInitialForm(null);
+ callEntity.setFinalForm(null);
+ 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);
+ } else {
+ throw new CustomValidationException(Status.BAD_REQUEST,
+ Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField));
}
+ } else {
+ Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
+ Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
+ formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
+ 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);
}
}
}
}
}
}
- else {
+ } else {
Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel());
Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent()));
formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
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());
return convertFormEntityToFormResponseBean(formEntity);
}
- return convertFormEntityToFormResponseBean(formEntity);
+ return convertFormEntityToFormResponseBean(formEntity);
}
public FormEntity validateForm(Long formId) {
@@ -254,12 +339,28 @@ public class FormDao {
validator.validateUserWithCall(user, formEntity.getCall().getId());
List flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId());
List 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);
flowEdgesRepository.deleteAll(flowEdgesEntities);
CallEntity callEntity=formEntity.getCall();
+ //cloned for getting old call data
+ CallEntity oldCallData = Utils.getClonedEntityForData(callEntity);
+
callEntity.setFinalForm(null);
callEntity.setInitialForm(null);
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);
}
public List getFormsByCallId(CallEntity callEntity){
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java
index 57f67694..d2d3cef6 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FormFieldDao.java
@@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.dao;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
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.SettingRequestBean;
+import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.FormFieldResponseBean;
import net.gepafin.tendermanagement.model.response.SettingResponseBean;
import net.gepafin.tendermanagement.repositories.FormFieldRepository;
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.CustomValidationException;
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.stereotype.Component;
+import jakarta.servlet.http.HttpServletRequest;
+
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@@ -25,6 +30,12 @@ public class FormFieldDao {
@Autowired
private FormFieldRepository formFieldRepository;
+
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
public FormFieldEntity convertFormFieldRequestToFormFieldEntity(FormFieldRequest formFieldRequest) {
FormFieldEntity formFieldEntity = new FormFieldEntity();
@@ -34,7 +45,11 @@ public class FormFieldDao {
formFieldEntity.setSortOrder(formFieldRequest.getSortOrder());
formFieldEntity.setValidators(Utils.convertMapIntoJsonString(formFieldRequest.getValidators()));
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;
}
@@ -51,10 +66,10 @@ public class FormFieldDao {
return formFieldResponseBean;
}
- public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) {
- formFieldEntity = formFieldRepository.save(formFieldEntity);
- return formFieldEntity;
- }
+// public FormFieldEntity saveFormFieldEntity(FormFieldEntity formFieldEntity) {
+// formFieldEntity = formFieldRepository.save(formFieldEntity);
+// return formFieldEntity;
+// }
public void validateFormField(FormFieldRequest formFieldRequest) {
if (formFieldRequest.getSettings() == null || formFieldRequest.getLabel() == null) {
@@ -71,6 +86,7 @@ public class FormFieldDao {
public FormFieldResponseBean updateFormField(Long formFieldId, FormFieldRequest formFieldRequest) {
FormFieldEntity formFieldEntity = validateFormField(formFieldId);
+ FormFieldEntity oldFormFieldEntity = Utils.getClonedEntityForData(formFieldEntity);
Utils.setIfUpdated(formFieldEntity::getName, formFieldEntity::setName, formFieldRequest.getName());
Utils.setIfUpdated(formFieldEntity::getLabel, formFieldEntity::setLabel, formFieldRequest.getLabel());
Utils.setIfUpdated(formFieldEntity::getDescription, formFieldEntity::setDescription, formFieldRequest.getDescription());
@@ -80,7 +96,13 @@ public class FormFieldDao {
Utils.setIfUpdated(formFieldEntity::getValidators, formFieldEntity::setValidators,
Utils.convertMapIntoJsonString(formFieldRequest.getValidators()));
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);
}
@@ -99,6 +121,11 @@ public class FormFieldDao {
public void deleteFormById(Long formFieldId) {
FormFieldEntity formEntity = validateFormField(formFieldId);
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 settingRequestBeans) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java
index ee6e0d8a..17143516 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java
@@ -1,12 +1,17 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.HubEntity;
+import net.gepafin.tendermanagement.enums.VersionActionTypeEnum;
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.util.NanoIdUtils;
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.Status;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,15 +27,26 @@ public class HubDao {
@Autowired
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);
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);
}
- public HubResponseBean updateHub(Long hubId, HubReq hubReq) {
+ public HubResponseBean updateHub(HttpServletRequest request,Long hubId, HubReq hubReq) {
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);
}
@@ -43,10 +59,13 @@ public class HubDao {
return hubs.stream().map(this::convertToHubResponseBean).toList();
}
- public void deleteHub(Long hubId) {
+ public void deleteHub(HttpServletRequest request,Long 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.save(hubEntity);
}
public HubEntity validateHub(Long hubId) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java
index 9ff64040..75bbdde5 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java
@@ -1,12 +1,17 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.LoginAttemptEntity;
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.repositories.LoginAttemptRepository;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -24,10 +29,23 @@ public class LoginAttemptDao {
@Autowired
LoginAttemptRepository loginAttemptRepository;
- public void createLoginAttempt(LoginAttemptEntity loginAttemptEntity) {
- loginAttemptEntity.setAttemptDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
+ @Autowired
+ 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> getLoginAttemptsList(UserEntity userEntity, Integer pageNo, Integer pageLimit) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java
index 1a31c306..ceb64f54 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/LookUpDataDao.java
@@ -1,11 +1,16 @@
package net.gepafin.tendermanagement.dao;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.LookUpDataEntity;
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.LookUpDataRequest;
+import net.gepafin.tendermanagement.model.request.VersionHistoryRequest;
import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean;
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.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -25,6 +30,12 @@ public class LookUpDataDao {
@Autowired
private LookUpDataRepository lookUpDataRepository;
+ @Autowired
+ HttpServletRequest request;
+
+ @Autowired
+ LoggingUtil loggingUtil;
+
public LookUpDataResponseBean createLookUpData(LookUpDataRequest lookUpDataReq) {
LookUpDataEntity entity = convertLookUpDataReqToLookUpDataEntity(lookUpDataReq);
return convertLookUpDataEntityToResponseBean(entity);
@@ -37,6 +48,9 @@ public class LookUpDataDao {
entity.setValue(lookUpDataReq.getResponse());
validateLookUpDataEntity(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;
}
@@ -57,16 +71,27 @@ public class LookUpDataDao {
public LookUpDataResponseBean updateLookUpData(Long id, LookUpDataRequest lookUpDataReq) {
LookUpDataEntity entity = validateLookUpData(id);
+ LookUpDataEntity oldLookUpData = Utils.getClonedEntityForData(entity);
+
setIfUpdated(entity::getTitle, entity::setTitle, lookUpDataReq.getTitle());
setIfUpdated(entity::getValue, entity::setValue, lookUpDataReq.getValue());
setIfUpdated(entity::getResponse, entity::setResponse, lookUpDataReq.getResponse());
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);
}
public void deleteLookUpData(Long id) {
- LookUpDataEntity entity = validateLookUpData(id);
- lookUpDataRepository.deleteById(entity.getId());
+ LookUpDataEntity oldLookUpData = validateLookUpData(id);
+
+ /** 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) {
@@ -87,18 +112,22 @@ public class LookUpDataDao {
.map(this::convertLookUpDataEntityToResponseBean)
.collect(Collectors.toList());
}
-
- public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req,
- LookUpDataEntity.LookUpDataTypeEnum type) {
- if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) {
- LookUpDataEntity newEntity = new LookUpDataEntity();
- newEntity.setTitle(req.getTitle());
- newEntity.setValue(req.getValue());
- newEntity.setResponse(req.getResponse());
- newEntity.setType(type.getValue());
- validateLookUpDataEntity(newEntity);
- return lookUpDataRepository.save(newEntity);
- }
+
+ public LookUpDataEntity getOrCreateLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) {
+
+ if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0L)) {
+ LookUpDataEntity newEntity = new LookUpDataEntity();
+ newEntity.setTitle(req.getTitle());
+ newEntity.setValue(req.getValue());
+ newEntity.setResponse(req.getResponse());
+ newEntity.setType(type.getValue());
+ validateLookUpDataEntity(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())
.orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND,
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
index 456a614b..5ec81347 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
@@ -57,7 +57,7 @@ public class PdfDao {
try {
UserEntity userEntity = validator.validateUser(request);
ApplicationEntity applicationEntity = applicationDao.validateApplication(applicationId);
- validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
CallEntity call=callService.validateCall(applicationEntity.getCall().getId());
// Create a byte stream to hold the PDF
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java
index 97ecde18..a7606c9a 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java
@@ -3,6 +3,10 @@ package net.gepafin.tendermanagement.dao;
import java.time.LocalDateTime;
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.Value;
import org.springframework.stereotype.Component;
@@ -23,6 +27,11 @@ public class ProtocolDao {
@Value("${default.hub.uuid}")
private String defaultHubUuid;
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
public Long getProtocolNumber(HubEntity hubEntity) {
Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId());
@@ -43,6 +52,10 @@ public class ProtocolDao {
protocolEntity.setApplicationId(applicationEntity.getId());
protocolEntity.setHubId(hubId);
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;
}
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java
index b127b699..1db01f11 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java
@@ -13,25 +13,28 @@ public class S3PathConfig {
@Autowired
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);
- 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);
- return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId);
- }
- 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 : "");
+ return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId);
}
public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) {
S3ConfigEntity config = getDocumentPathForOther(type);
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) {
return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type));
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
index 53d21fc5..da5c6f07 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java
@@ -7,7 +7,10 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
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.VersionActionTypeEnum;
import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.response.CompanyResponse;
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.RoleService;
import net.gepafin.tendermanagement.service.impl.AuthenticationService;
+import net.gepafin.tendermanagement.util.LoggingUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.util.Validator;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -80,27 +84,43 @@ public class UserDao {
@Autowired
private AuthenticationService authenticationService;
-
+ @Autowired
+ private LoggingUtil loggingUtil;
+
+ @Autowired
+ private HttpServletRequest request;
+
public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) {
- if(StringUtils.isEmpty(userReq.getHubUuid())) {
- userReq.setHubUuid(defaultHubUuid);
- }
- HubEntity hub = hubService.getHubByUuid(userReq.getHubUuid());
- validateUserRequest(request, tempToken, userReq, hub);
- validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken);
- RoleEntity roleEntity = getRoleEntity(userReq.getRoleId());
- BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq, hub);
+
+ if (StringUtils.isEmpty(userReq.getHubUuid())) {
+ userReq.setHubUuid(defaultHubUuid);
+ }
+ HubEntity hub = hubService.getHubByUuid(userReq.getHubUuid());
+ validateUserRequest(request, tempToken, userReq, hub);
+ validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken);
+ RoleEntity roleEntity = getRoleEntity(userReq.getRoleId());
+ BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq, hub);
UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq, hub);
log.info("User created with ID: {}", userEntity.getId());
- LoginReq loginReq=new LoginReq();
+ LoginReq loginReq = new LoginReq();
loginReq.setEmail(userEntity.getEmail());
- if(userEntity!=null){
- LoginAttemptEntity loginAttemptEntity =authenticationService.prepareLoginAttemptEntity(loginReq, request);
+ LoginAttemptEntity loginAttemptEntity = null;
+ if (userEntity != null) {
+ loginAttemptEntity = authenticationService.prepareLoginAttemptEntity(loginReq, request);
log.info("Authentication failed for email: {}", loginReq.getEmail());
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) {
@@ -195,6 +215,7 @@ public class UserDao {
public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) {
log.info("Updating user with ID: {}", userId);
UserEntity userEntity=validateUser(userId);
+ UserEntity oldUserEntity = Utils.getClonedEntityForData(userEntity);
log.info("Current user details: {}", userEntity);
log.info("New user details: {}", userReq);
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());
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());
return convertUserEntityToUserResponse(userEntity);
}
@@ -304,7 +329,11 @@ public class UserDao {
public void deleteUser(Long 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);
log.info("User deleted with ID: {}", id);
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
index f4a07849..52321b43 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java
@@ -1,9 +1,14 @@
package net.gepafin.tendermanagement.dao;
import feign.FeignException;
+import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.enums.UserActionContextEnum;
+import net.gepafin.tendermanagement.enums.UserActionLogsEnum;
+import net.gepafin.tendermanagement.model.request.UserActionRequest;
import net.gepafin.tendermanagement.service.feignClient.VatCheckService;
+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.Status;
@@ -38,9 +43,14 @@ public class VatCheckDao {
public final Logger log = LoggerFactory.getLogger(VatCheckDao.class);
+ @Autowired
+ private LoggingUtil loggingUtil;
+ @Autowired
+ private HttpServletRequest request;
public Map checkVatNumberApi(String vatNumber) {
+
if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) {
return new HashMap<>();
}
@@ -50,11 +60,11 @@ public class VatCheckDao {
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set(GepafinConstant.AUTHORIZATION, "Bearer " + vatCheckNewToken);
- headers.add(org.apache.http.HttpHeaders.USER_AGENT,
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0");
+ headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0");
URI baseUrl = URI.create(GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL);
- ResponseEntity