KON-14 - Kontakte-Modulzuordnung Suche
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
index 1a29808..faf8b5a 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
@@ -51,6 +51,7 @@
             @RequestParam( "searchText" ) Optional<String> searchText,
             @RequestParam( "moduleName") Optional<String> moduleName,
             @RequestParam( "withoutAssignedModule") Optional<Boolean> withoutAssignedModule,
+            @RequestParam( "expiringDataInPast" ) Optional<Boolean> expiringDataInPast,
             @PageableDefault( sort = {"name"}, size = 20, direction = ASC) Pageable pageable ) {
         return contactService.findDetailedContacts(
                 contactType.orElse(null),
@@ -58,6 +59,7 @@
                 searchText.orElse( null),
                 moduleName.orElse(null),
                 withoutAssignedModule.orElse(Boolean.FALSE),
+                expiringDataInPast.orElse(Boolean.FALSE),
                 pageable);
     }
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
index a3000e9..e679c4f 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
@@ -21,25 +21,30 @@
 import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
 
+import java.util.Date;
 import java.util.UUID;
 
 public interface DetailedContactRepository extends PagingAndSortingRepository<VwDetailedContact, Long> {
     Page<VwDetailedContact> findAll(Pageable pageable);
 
     @Query( "select dc from VwDetailedContact dc "
-            + "left outer join TblAssignmentModulContact ass on"
-            + " ass.tblContact.id = dc.fkContactId"
             + " where (COALESCE(:contactType) is null or COALESCE(:contactType) is not null AND dc.contactType=:contactType)"
             + " and (COALESCE(:personType) is null or COALESCE(:personType) is not null AND dc.personTypeUuid=:personType)"
             + " and (COALESCE(:searchText) is null or COALESCE(:searchText) is not null AND dc.searchfield like %:searchText%)"
-            + " and (COALESCE(:moduleName) is null or COALESCE(:moduleName) is not null AND ass.modulName = :moduleName)"
-            + " and (COALESCE(:withoutModule) = false or COALESCE(:withoutModule) = true AND ass is null)"
+            + " and (COALESCE(:moduleName) is null or COALESCE(:moduleName) is not null AND dc.fkContactId in (select distinct amc.tblContact.id from TblAssignmentModulContact amc where amc.modulName=:moduleName))"
+            + " and (COALESCE(:withoutModule) = false or COALESCE(:withoutModule) = true AND dc.fkContactId not in "
+            + "        (select distinct amc.tblContact.id from TblAssignmentModulContact amc)) "
+            + " and (COALESCE(:dateTimeNow) is null or COALESCE(:dateTimeNow) is not null AND dc.fkContactId in "
+            + "        (select distinct amc.tblContact.id from TblAssignmentModulContact amc where "
+            + "           amc.expiringDate is not null and amc.expiringDate < :dateTimeNow and "
+            + "          (amc.deletionLockUntil is null or amc.deletionLockUntil is not null and amc.deletionLockUntil < :dateTimeNow )))"
     )
     Page<VwDetailedContact> findByFilter(@Param("contactType")String contactType,
                                          @Param("personType") UUID personType,
                                          @Param("searchText") String searchText,
                                          @Param("moduleName") String moduleName,
                                          @Param("withoutModule") boolean withoutModule,
+                                         @Param("dateTimeNow") Date dateTimeNow,
                                          Pageable pageable);
 }
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
index de09d97..4dbe779 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
@@ -24,6 +24,8 @@
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.time.Instant;
+import java.util.Date;
 import java.util.UUID;
 
 @Log4j2
@@ -41,13 +43,15 @@
                                                         String searchText,
                                                         String moduleName,
                                                         boolean withoutModule,
+                                                        boolean expiringDataInPast,
                                                         Pageable pageable) {
 
         if( contactType == null &&
                 personTypeUuid == null &&
                 searchText == null &&
                 moduleName == null &&
-                !withoutModule) {
+                !withoutModule &&
+                !expiringDataInPast ) {
             return detailedContactRepository.findAll(pageable);
         }
         else {
@@ -56,6 +60,7 @@
                     searchText != null ? searchText.toUpperCase() : null,
                     moduleName,
                     withoutModule,
+                    expiringDataInPast ? Date.from(Instant.now()) : null,
                     pageable);
         }
     }
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
index c27791b..841fe76 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
@@ -54,7 +54,7 @@
         Page<VwDetailedContact> retPage = MockDataHelper.mockVDetailedContactPage();
 
         when(contactService.findDetailedContacts(
-                isNull(), isNull(), isNull(), isNull(), anyBoolean(), any(Pageable.class))).thenReturn(retPage);
+                isNull(), isNull(), isNull(), isNull(), anyBoolean(), anyBoolean(), any(Pageable.class))).thenReturn(retPage);
 
         mockMvc.perform(get("/contacts"))
                 .andExpect(status().is2xxSuccessful())
diff --git a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
index 544867a..f3ed1c4 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
@@ -49,7 +49,7 @@
         Page<VwDetailedContact> mockPaged = MockDataHelper.mockVDetailedContactPage();
         when(detailedContactRepository.findAll(any(Pageable.class))).thenReturn(mockPaged);
         Page<VwDetailedContact> retPage = contactService.findDetailedContacts(
-                null, null, null, null, false, PageRequest.of(0, 20));
+                null, null, null, null, false, false, PageRequest.of(0, 20));
 
         assertEquals(mockPaged.getTotalElements(), retPage.getTotalElements());
     }