diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
index e9cc9eae..834462a1 100644
--- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
+++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
@@ -388,5 +388,6 @@ public class GepafinConstant {
public static final String APPLICATION_PER_STATUS="applicationPerStatus";
public static final String NON_EMPTY_TABLES="nonEmptyTables";
public static final String VALIDATION_IN_TABLE = "validation.table.message";
+ public static final String CALL_EXPIRED="call.expired";
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
index b7602621..ba847ca3 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
@@ -49,7 +49,9 @@ import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.MessageFormat;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
@@ -186,6 +188,7 @@ public class ApplicationDao {
// callService.validatePublishedCall(formEntity.getCall().getId());
validateFormFields(applicationRequestBean,formEntity);
ApplicationEntity applicationEntity = validateApplication(applicationId);
+ checkCallEndDate(applicationEntity.getCall());
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));
@@ -405,6 +408,7 @@ public class ApplicationDao {
responseBean.setProgress(progress);
responseBean.setCallTitle(applicationEntity.getCall().getName());
responseBean.setCallEndDate(applicationEntity.getCall().getEndDate());
+ responseBean.setCallEndTime(applicationEntity.getCall().getEndTime());
responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate());
responseBean.setCallId(applicationEntity.getCall().getId());
responseBean.setSubmissionDate(applicationEntity.getSubmissionDate());
@@ -872,7 +876,7 @@ public class ApplicationDao {
ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) {
CallEntity call = callService.validateCall(callId);
UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId());
-
+ checkCallEndDate(call);
// call = callService.validatePublishedCall(call.getId());
// checkIfApplicationExists(call, userWithCompanyEntity, userEntity);
ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity);
@@ -890,7 +894,7 @@ public class ApplicationDao {
public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
-
+ checkCallEndDate(applicationEntity.getCall());
//cloned entity for old application data
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
@@ -1119,7 +1123,7 @@ public class ApplicationDao {
public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId,
MultipartFile file) {
ApplicationEntity applicationEntity = validateApplication(applicationId);
-
+ checkCallEndDate(applicationEntity.getCall());
//cloned entity for old data
ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(applicationEntity);
@@ -1252,7 +1256,8 @@ public class ApplicationDao {
ApplicationEntity applicationEntity = validateApplication(applicationId);
ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity);
-
+ checkCallEndDate(applicationEntity.getCall());
+
UserEntity userEntity = userService.validateUser(applicationEntity.getUserId());
validator.validateUserWithCompany(request, applicationEntity.getCompanyId());
if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) {
@@ -1516,4 +1521,21 @@ public class ApplicationDao {
return predicates;
}
+ public void checkCallEndDate(CallEntity call) {
+ LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now());
+
+ LocalDateTime callEndDateTime = LocalDateTime.of(
+ call.getEndDate().toLocalDate(),
+ call.getEndTime()
+ );
+
+ if (now.isAfter(callEndDateTime)) {
+ throw new CustomValidationException(
+ Status.BAD_REQUEST,
+ Translator.toLocale(GepafinConstant.CALL_EXPIRED)
+ );
+ }
+ }
+
+
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
index 8c89b510..48573e4f 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java
@@ -113,12 +113,21 @@ public class ApplicationEvaluationDao {
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
+ @Autowired
+ private HubService hubService;
+
private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) {
ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity();
AssignedApplicationsEntity assignedApplications = assignedApplicationsService.validateAssignedApplication(assignedApplciationId);
ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId());
+
+ Long hubId = application.getHubId();
+ HubEntity hub = hubService.valdateHub(hubId);
+
+ Long initialDays = (hub != null) ? hub.getEvaluationExpirationDays() : 0L;
+
entity.setApplicationId(application.getId());
entity.setAssignedApplicationsEntity(assignedApplications);
entity.setUserId(user.getId());
@@ -128,7 +137,7 @@ public class ApplicationEvaluationDao {
entity.setNote(req.getNote());
entity.setMotivation(req.getMotivation());
entity.setIsDeleted(false);
- entity.setInitialDays(30L);
+ entity.setInitialDays(initialDays);
entity.setRemainingDays(30L);
entity.setSuspendedDays(0L);
entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
index faec3489..bf68f3b9 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java
@@ -296,6 +296,8 @@ public class FlowFormDao {
applicationDao.processForm(formEntity, applicationEntity));
nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId());
nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName());
+ nextOrPreviousFormResponse.setCallEndDate(applicationEntity.getCall().getEndDate());
+ nextOrPreviousFormResponse.setCallEndTime(applicationEntity.getCall().getEndTime());
nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompanyId());
nextOrPreviousFormResponse.setCompanyName(company.getCompanyName());
diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java
index 52aa6cc2..ccd6c325 100644
--- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java
+++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java
@@ -63,4 +63,7 @@ public class HubEntity extends BaseEntity{
@Column(name = "AREA_CODE")
private String areaCode;
+
+ @Column(name = "EVALUATION_EXPIRATION_DAYS")
+ private Long evaluationExpirationDays;
}
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
index 1aae69e2..2c659838 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java
@@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseB
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.List;
@Data
@@ -18,6 +19,8 @@ public class ApplicationResponse{
private LocalDateTime callEndDate;
+ private LocalTime callEndTime;
+
private LocalDateTime modifiedDate;
private Integer progress;
diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
index bea417a1..6bed05fc 100644
--- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
+++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java
@@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.time.LocalTime;
@Data
public class NextOrPreviousFormResponse {
@@ -20,6 +21,10 @@ public class NextOrPreviousFormResponse {
private Long completedSteps;
private Long currentStep;
+
+ private LocalDateTime callEndDate;
+
+ private LocalTime callEndTime;
private Long companyId;
diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java
index 8221117a..9909f732 100644
--- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java
+++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java
@@ -153,11 +153,17 @@ public class AmazonS3ServiceImpl implements AmazonS3Service {
}
}
+ private String decodeS3Key(String key) {
+ return URLDecoder.decode(key, StandardCharsets.UTF_8);
+ }
+
@Override
public UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath) {
try {
+ log.info("Original Paths - oldPath: {}, newPath: {}", oldPath, newPath);
+
+ oldPath = decodeS3Key(cleanOldPath(oldPath));
newPath = cleanNewPath(oldPath, newPath);
- oldPath = cleanOldPath(oldPath);
log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName);
CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath);
diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml
index d8c7dbea..349633de 100644
--- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml
+++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml
@@ -2229,4 +2229,23 @@
+
+
+
+
+
+
+
+
+
+
+ unique_uuid = 't7jh5wfg9QXylNaTZkPoE'
+
+
+
+
+ unique_uuid = 'p4lk3bcx1RStqTaIVVbXs'
+
+
+
diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties
index 1066eaaa..70c783b9 100644
--- a/src/main/resources/message_en.properties
+++ b/src/main/resources/message_en.properties
@@ -351,3 +351,4 @@ user.with.company.not.found = User with company not found for user or company.
user.action.fetched.successfully = User action details fetched successfully.
action.context.labels.fetched.successfully = Action Context Labels Fetched Successfully.
amount.accepted.required=Amount accepted is required while approving the application.
+call.expired=Call has been expired.
diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties
index ca782fe6..54b7dae9 100644
--- a/src/main/resources/message_it.properties
+++ b/src/main/resources/message_it.properties
@@ -304,7 +304,6 @@ beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e
user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione.
company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite.
response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero.
-application.cannot.approved.or.rejected=La domanda non pu� essere approvata o rifiutata perch� l'emendamento � attivo.
valid.vatnumber.message=Il numero di partita IVA � valido.
application.cannot.approved.or.rejected=La domanda non pu? essere approvata o rifiutata perch? l'emendamento ? attivo.
@@ -342,4 +341,5 @@ user.with.company.not.found = Utente con azienda non trovato per utente o aziend
user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente.
action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente.
amount.accepted.required=L'importo accettato � obbligatorio durante l'approvazione della domanda.
-validation.table.message=I dati per il campo {0} non sono presenti.
\ No newline at end of file
+validation.table.message=I dati per il campo {0} non sono presenti.
+call.expired=La chiamata � scaduta.