diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java index ff67a0661..1dd2c103b 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/CreateOrUpdateDossierStatusRequest.java @@ -19,5 +19,7 @@ public class CreateOrUpdateDossierStatusRequest { private String color; + private int rank; + private String dossierTemplateId; } diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java index bbd8e256a..43929cb3a 100644 --- a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java +++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/dossiertemplate/dossier/DossierStatusInfo.java @@ -22,6 +22,7 @@ public class DossierStatusInfo { private String description; private String color; private String dossierTemplateId; + private int rank; private Long dossierCount; } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java index 0e8d77cc7..ea312ef03 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierStatusEntity.java @@ -32,6 +32,9 @@ public class DossierStatusEntity { @Column private String color; + @Column + private int rank; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dossier_template_id") private DossierTemplateEntity dossierTemplate; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java index d96aaf9a6..bf9ae9def 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierStatusPersistenceService.java @@ -38,6 +38,13 @@ public class DossierStatusPersistenceService { if (dossierStatus.isPresent()) { validateDossierTemplateNameIsUnique(createOrUpdateDossierStatusRequest.getName(), createOrUpdateDossierStatusRequest.getDossierTemplateId(), createOrUpdateDossierStatusRequest.getDossierStatusId()); + if (createOrUpdateDossierStatusRequest.getRank() != dossierStatus.get().getRank() + && dossierStatusRepository.getDuplicateRanks(dossierStatus.get().getDossierTemplateId(), + createOrUpdateDossierStatusRequest.getRank()) > 0) { + // in case of duplicate ranks, increase the ranks + dossierStatusRepository.adjustRanksForDossierTemplate(dossierStatus.get().getDossierTemplateId(), + createOrUpdateDossierStatusRequest.getRank()); + } BeanUtils.copyProperties(createOrUpdateDossierStatusRequest, dossierStatus.get()); return dossierStatus.get(); } else { @@ -49,6 +56,12 @@ public class DossierStatusPersistenceService { dossierStatus.setId(UUID.randomUUID().toString()); BeanUtils.copyProperties(createOrUpdateDossierStatusRequest, dossierStatus); var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(createOrUpdateDossierStatusRequest.getDossierTemplateId()); + // in case of duplicate ranks, increase the ranks + if (dossierStatusRepository.getDuplicateRanks(createOrUpdateDossierStatusRequest.getDossierTemplateId(), + createOrUpdateDossierStatusRequest.getRank()) > 0) { + dossierStatusRepository.adjustRanksForDossierTemplate(createOrUpdateDossierStatusRequest.getDossierTemplateId(), + createOrUpdateDossierStatusRequest.getRank()); + } var loadedDossierStatus = dossierStatusRepository.save(dossierStatus); loadedDossierStatus.setDossierTemplate(dossierTemplate); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java index da61bcaf0..1ec58ccab 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierStatusRepository.java @@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import java.util.List; @@ -11,10 +12,22 @@ import java.util.Optional; public interface DossierStatusRepository extends JpaRepository { @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + - "s.description, s.color, s.dossierTemplateId, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.dossierTemplateId in ( :dossierTemplateIds ) group by s") + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s " + + "left outer join s.dossiers d where s.dossierTemplateId in (:dossierTemplateIds) group by s order by s.rank ASC") List getAllDossierStatusForDossierTemplate(List dossierTemplateIds); @Query("select new com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo(s.id, s.name," + - "s.description, s.color, s.dossierTemplateId, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s") + "s.description, s.color, s.dossierTemplateId, s.rank, count(d)) from DossierStatusEntity s left outer join s.dossiers d where s.id = :dossierStatusId group by s") Optional findProjectionById(String dossierStatusId); + + @Modifying + @Query("update DossierStatusEntity d set d.rank = :newRank where d.id = :dossierStatusId") + void updateRank(String dossierStatusId, int newRank); + + @Modifying + @Query("update DossierStatusEntity d set d.rank = d.rank + 1 where d.dossierTemplateId = :dossierTemplateId and d.rank >= :rank") + void adjustRanksForDossierTemplate(String dossierTemplateId, int rank); + + @Query("select count(d) from DossierStatusEntity d where d.dossierTemplateId = :dossierTemplateId and d.rank = :rankToCheck") + int getDuplicateRanks(String dossierTemplateId, int rankToCheck); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-added-rank-dossier-status.changelog.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-added-rank-dossier-status.changelog.yaml new file mode 100644 index 000000000..4f45d6b8d --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/12-added-rank-dossier-status.changelog.yaml @@ -0,0 +1,12 @@ +databaseChangeLog: + - changeSet: + id: added-rank-dossier-status.changelog + author: corina + changes: + - addColumn: + columns: + - column: + name: rank + type: INTEGER + defaultValue: 0 + tableName: dossier_status diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml index 61b60d191..0df9337af 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/persistence-service-v1/persistence-service-server-v1/src/main/resources/db/changelog/db.changelog-master.yaml @@ -27,6 +27,8 @@ databaseChangeLog: file: db/changelog/11-added-dictionary_false_positive_tables.changelog.yaml - include: file: db/changelog/12-dossier-visibility.changelog.yaml + - include: + file: db/changelog/12-added-rank-dossier-status.changelog.yaml - include: file: db/changelog/13-file-manual-change-date.changelog.yaml - include: diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java index f1e01d24d..7937396ad 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DossierStatusTest.java @@ -38,7 +38,7 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { assertThat(allDossierStatus.size()).isZero(); - // Create + // Create first state CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest(); crudsr.setName("name1"); crudsr.setDescription("description1"); @@ -47,13 +47,16 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { var loadedDossierStatus = dossierStatusClient.createOrUpdateDossierStatus(crudsr); assertThat(loadedDossierStatus).isNotNull(); assertThat(loadedDossierStatus.getDossierCount()).isNull(); + assertThat(loadedDossierStatus.getRank()).isEqualTo(crudsr.getRank()); - // update + // update first state crudsr.setDossierStatusId(loadedDossierStatus.getId()); crudsr.setDescription("New Description"); + crudsr.setRank(1); var updatedStatus = dossierStatusClient.createOrUpdateDossierStatus(crudsr); assertThat(updatedStatus.getDescription()).isEqualTo(crudsr.getDescription()); assertThat(updatedStatus.getDossierCount()).isNull(); + assertThat(updatedStatus.getRank()).isEqualTo(crudsr.getRank()); // get all for template id allDossierStatus = dossierStatusClient.getAllDossierStatusForTemplate(dossierTemplate.getId()); @@ -85,13 +88,17 @@ public class DossierStatusTest extends AbstractPersistenceServerServiceTest { // Create CreateOrUpdateDossierStatusRequest crudsr2 = new CreateOrUpdateDossierStatusRequest(); - crudsr2.setName("name2"); - crudsr2.setDescription("description2"); + crudsr2.setName("name3"); + crudsr2.setDescription("description3"); + crudsr2.setRank(1); crudsr2.setDossierTemplateId(dossierTemplate.getId()); // create second dossier status var loadedDossierStatus2 = dossierStatusClient.createOrUpdateDossierStatus(crudsr2); assertThat(loadedDossierStatus2).isNotNull(); + assertThat(loadedDossierStatus2.getRank()).isEqualTo(crudsr2.getRank()); + loadedDossierStatus = dossierStatusClient.getDossierStatus(loadedDossierStatus.getId()); + assertThat(loadedDossierStatus.getRank()).isEqualTo(crudsr.getRank() + 1); allDossierStatus = dossierStatusClient.getAllDossierStatusForTemplate(dossierTemplate.getId()); assertThat(allDossierStatus.size()).isEqualTo(2);