Resolved conflicts

This commit is contained in:
rajesh
2025-03-05 19:59:08 +05:30
8 changed files with 218 additions and 13 deletions

View File

@@ -485,6 +485,11 @@ public class GepafinConstant {
public static final String USAGE="usage"; public static final String USAGE="usage";
public static final String LIMIT="limit"; public static final String LIMIT="limit";
public static final String DATA="data"; public static final String DATA="data";
public static final String PREFERRED_CALL_ID="preferredCallId";
public static final String REGION_ID="regionId";
} }

View File

@@ -1047,7 +1047,7 @@ public class ApplicationAmendmentRequestDao {
List<ApplicationAmendmentRequestEntity> amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( List<ApplicationAmendmentRequestEntity> amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(
existingApplicationAmendment.getApplicationEvaluationEntity().getId()); existingApplicationAmendment.getApplicationEvaluationEntity().getId());
Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> (amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()) || amendment.getStatus().equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue())));
ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId()); ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId());
ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application); ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application);
if (Boolean.TRUE.equals(allClosed)) { if (Boolean.TRUE.equals(allClosed)) {

View File

@@ -424,7 +424,7 @@ public class ApplicationDao {
responseBean.setCallTitle(applicationEntity.getCall().getName()); responseBean.setCallTitle(applicationEntity.getCall().getName());
responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); responseBean.setCallEndDate(applicationEntity.getCall().getEndDate());
responseBean.setCallEndTime(applicationEntity.getCall().getEndTime()); responseBean.setCallEndTime(applicationEntity.getCall().getEndTime());
responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); responseBean.setModifiedDate(applicationEntity.getUpdatedDate());
responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setCallId(applicationEntity.getCall().getId());
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
responseBean.setStatus(applicationEntity.getStatus()); responseBean.setStatus(applicationEntity.getStatus());

View File

@@ -4,9 +4,12 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.Timestamp;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@@ -16,6 +19,7 @@ import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Root;
import jakarta.persistence.criteria.*;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.enums.*;
@@ -1083,10 +1087,14 @@ public class CallDao {
expirePublishedCalls(request); expirePublishedCalls(request);
Integer year = null; Integer year = null;
String search = null; String search = null;
Map<String, FilterCriteria> filters = new HashMap<>();
if (callPageableRequestBean.getGlobalFilters() != null) { if (callPageableRequestBean.getGlobalFilters() != null) {
year = callPageableRequestBean.getGlobalFilters().getYear(); year = callPageableRequestBean.getGlobalFilters().getYear();
search = callPageableRequestBean.getGlobalFilters().getSearch(); search = callPageableRequestBean.getGlobalFilters().getSearch();
} }
if (callPageableRequestBean.getFilters() != null) {
filters = callPageableRequestBean.getFilters();
}
List<Predicate> predicates = new ArrayList<>(); List<Predicate> predicates = new ArrayList<>();
if (year != null && year > 0) { if (year != null && year > 0) {
int filterYear = callPageableRequestBean.getGlobalFilters().getYear(); int filterYear = callPageableRequestBean.getGlobalFilters().getYear();
@@ -1129,7 +1137,7 @@ public class CallDao {
.toList(); .toList();
predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); predicates.add(root.get(GepafinConstant.STATUS).in(statusValues));
} }
applyFilters(root, criteriaBuilder, predicates, filters);
predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId()));
return predicates; return predicates;
@@ -1185,6 +1193,128 @@ public class CallDao {
callRepository.saveAll(expiredCalls); // Save all modified calls at once callRepository.saveAll(expiredCalls); // Save all modified calls at once
} }
} }
private void applyFilters(Root<?> root, CriteriaBuilder criteriaBuilder, List<Predicate> predicates, Map<String, FilterCriteria> filters) {
if (Boolean.FALSE.equals(filters.isEmpty())) {
for (Map.Entry<String, FilterCriteria> entry : filters.entrySet()) {
String fieldName = entry.getKey();
FilterCriteria filterCriteria = entry.getValue();
Object value = filterCriteria.getValue();
MatchModeEnum matchMode = filterCriteria.getMatchMode();
if (value != null && matchMode != null) {
Path<?> fieldPath = getFieldPath(root, fieldName);
if (fieldPath != null) {
applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode);
applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode);
applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root);
}
}
}
}
}
private void applyStringFilter(Path<?> fieldPath, CriteriaBuilder criteriaBuilder, List<Predicate> predicates, Object value, MatchModeEnum matchMode) {
if (value instanceof String) {
String valueStr = (String) value;
if (fieldPath.getJavaType().equals(String.class)) {
MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue());
switch (mode) {
case CONTAINS ->
predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%"));
case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr));
case STARTSWITH ->
predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%"));
case ENDSWITH ->
predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase()));
}
}
}
}
private void applyNumberFilter(Path<?> fieldPath, CriteriaBuilder criteriaBuilder, List<Predicate> predicates, Object value, MatchModeEnum matchMode) {
if (Number.class.isAssignableFrom(fieldPath.getJavaType())) {
Number numberValue = null;
if (value instanceof Number) {
numberValue = (Number) value;
}
MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue());
switch (mode) {
case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue));
}
}
}
private void applyDateFilter(Path<?> fieldPath, CriteriaBuilder criteriaBuilder, List<Predicate> predicates, Object value, MatchModeEnum matchMode, Root<?> root) {
if (fieldPath.getJavaType().equals(LocalDateTime.class)) {
// Convert input string: Replace 'T' with space
String formattedValue = value.toString().replace("T", " ");
// Handle timezones and UTC (`Z` or `+HH:mm`)
if (formattedValue.contains("Z") || formattedValue.matches(".*[+-]\\d{2}:\\d{2}$")) {
OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
formattedValue = offsetDateTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}
// Check if more than 3 decimal places exist
if (formattedValue.contains(".")) {
int dotIndex = formattedValue.indexOf(".");
if (formattedValue.length() > dotIndex + 4) {
formattedValue = formattedValue.substring(0, dotIndex + 4); // Keep only 3 decimals
}
} else {
formattedValue += ".000"; // Ensure 3 decimals
}
// Define correct date-time format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// Parse the formatted value into LocalDateTime
LocalDateTime dateTimeValue = LocalDateTime.parse(formattedValue, formatter);
// Extract only the date portion
LocalDate dateValue = dateTimeValue.toLocalDate();
// Convert database field to LocalDate for date-only comparison
Expression<LocalDate> dateField = criteriaBuilder.function("DATE", LocalDate.class, fieldPath);
MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue());
switch (mode) {
case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue));
case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue));
case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue)));
case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue)));
}
}
}
private Path<?> getFieldPath(Root<?> root, String fieldName) {
try {
return switch (fieldName) {
case GepafinConstant.REGION_ID -> {
// Ensure join is only created if not already present
Join<?, RegionEntity> regionJoin = root.getJoins().stream()
.filter(j -> j.getAttribute().getName().equals("region"))
.findFirst()
.map(j -> (Join<?, RegionEntity>) j)
.orElseGet(() -> root.join("region", JoinType.LEFT));
yield regionJoin.get("id");
}
default -> root.get(fieldName);
};
} catch (IllegalArgumentException e) {
return null;
}
}
public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) { public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) {

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.dao; package net.gepafin.tendermanagement.dao;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CopyObjectRequest; import com.amazonaws.services.s3.model.CopyObjectRequest;
import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Predicate;
@@ -33,6 +34,7 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -86,6 +88,9 @@ public class CompanyDocumentDao {
@Autowired @Autowired
private Validator validator; private Validator validator;
@Autowired
private AmazonS3 amazonS3;
public List<CompanyDocumentResponseBean> uploadFileForCompany(HttpServletRequest request, Long userId, List<MultipartFile> files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate,String name){ public List<CompanyDocumentResponseBean> uploadFileForCompany(HttpServletRequest request, Long userId, List<MultipartFile> files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate,String name){
DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId); DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId);
validator.validateUserWithCompany(request,companyId); validator.validateUserWithCompany(request,companyId);
@@ -271,8 +276,11 @@ public class CompanyDocumentDao {
s3Client.copyObject(copyRequest); s3Client.copyObject(copyRequest);
log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); log.info("File copied successfully from {} to {}", oldS3Path, newS3Path);
URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path);
String fileUrl = amazonS3Url.toString();
DocumentEntity entity = new DocumentEntity(); DocumentEntity entity = new DocumentEntity();
entity.setFilePath(newS3Path); entity.setFilePath(fileUrl);
entity.setFileName(companyDocumentEntity.getFileName()); entity.setFileName(companyDocumentEntity.getFileName());
entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue());
entity.setType(documentTypeEnum.getValue()); entity.setType(documentTypeEnum.getValue());

View File

@@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonValue;
public enum MatchModeEnum { public enum MatchModeEnum {
STARTSWITH("Starts with"), STARTSWITH("startsWith"),
ENDSWITH("Ends with"), ENDSWITH("endsWith"),
CONTAINS("Contains"), CONTAINS("contains"),
EQUALS("Equals"), EQUALS("equals"),
DATEIS("Date is"), DATEIS("dateIs"),
DATEISNOT("Date is not"), DATEISNOT("dateIsNot"),
BEFORE("Date is before"), BEFORE("dateBefore"),
AFTER("Date is after"); AFTER("dateAfter");
private String value; private String value;

View File

@@ -4,6 +4,7 @@ import lombok.Data;
import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.CallStatusEnum;
import java.util.List; import java.util.List;
import java.util.Map;
@Data @Data
public class CallPageableRequestBean { public class CallPageableRequestBean {
@@ -11,4 +12,6 @@ public class CallPageableRequestBean {
private GlobalFilters globalFilters; private GlobalFilters globalFilters;
private List<CallStatusEnum> status; private List<CallStatusEnum> status;
private Map<String, FilterCriteria> filters;
} }

View File

@@ -2561,5 +2561,64 @@
<sqlFile dbms="postgresql" <sqlFile dbms="postgresql"
path="db/dump/update_form_field_data_03-03-2025.sql"/> path="db/dump/update_form_field_data_03-03-2025.sql"/>
</changeSet> </changeSet>
<changeSet id="05-03-2025_NK_190115" author="Nisha Kashyap">
<sql dbms="postgresql">select
setval('gepafin_schema.role_id_seq', (select
max(id)+1
from gepafin_schema.role), false)
</sql>
<sql dbms="postgresql">select
setval('gepafin_schema.beneficiary_id_seq', (select
max(id)+1
from gepafin_schema.beneficiary), false)
</sql>
<insert tableName="role">
<column name="role_name" value="confidi"/>
<column name="role_type" value="ROLE_CONFIDI"/>
<column name="description"
value="Companies or individuals looking for financing opportunities. They can view, search, and apply to available confidi calls."/>
<column name="created_date" value="2025-03-05 00:00:00"/>
<column name="updated_date" value="2025-03-05 00:00:00"/>
<column name="permissions" value="VIEW_CONFIDI_CALLS, APPLY_CONFIDI_CALLS"/>
<column name="region_id" valueComputed="1"/>
</insert>
<insert tableName="BENEFICIARY">
<column name="EMAIL" value="confidi@test.test"/>
<column name="FIRST_NAME" value="Test"/>
<column name="LAST_NAME" value="Confidi"/>
<column name="PHONE_NUMBER" value="1234567890"/>
<column name="ORGANIZATION" value="ConfidiOrg"/>
<column name="ADDRESS" value="789 Victory Road"/>
<column name="CITY" value="Naples"/>
<column name="COUNTRY" value="Italy"/>
<column name="CODICE_FISCALE" value="0123456789"/>
<column name="DATE_OF_BIRTH" value="1985-06-15T00:00:00"/>
<column name="PRIVACY" value="true"/>
<column name="TERMS" value="true"/>
<column name="MARKETING" value="false"/>
<column name="OFFERS" value="true"/>
<column name="THIRD_PARTY" value="false"/>
<column name="HUB_ID" value="1"/>
</insert>
<insert tableName="GEPAFIN_USER">
<column name="email" value="confidi@test.test"/>
<column name="password" value="$2a$10$doUyOcEm8WPuFfpFT5y18.1DvZzF7exbqgy9X0P27cUBK7YWbfzzS"/>
<column name="first_name" value="Test"/>
<column name="last_name" value="Confidi"/>
<column name="last_login" value="2024-03-05T12:00:00"/>
<column name="organization" value="ConfidiOrg"/>
<column name="role_id" valueComputed="(SELECT id FROM role WHERE role_type = 'ROLE_CONFIDI')"/>
<column name="status" value="ACTIVE"/>
<column name="last_login" value="2024-12-19 00:00:00"/>
<column name="organization" value="ConfidiOrg"/>
<column name="address" value="789 Victory Road"/>
<column name="city" value="Naples"/>
<column name="country" value="Italy"/>
<column name="hub_id" value="1"/>
<column name="beneficiary_id" valueComputed="(SELECT id FROM BENEFICIARY WHERE EMAIL = 'confidi@test.test' ORDER BY id DESC LIMIT 1)"/>
</insert>
</changeSet>
</databaseChangeLog> </databaseChangeLog>