KON-13 KON-542 Suche nach Deletion Date
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 faf8b5a..2770869 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/ContactController.java
@@ -20,6 +20,7 @@
 import lombok.extern.log4j.Log4j2;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.service.ContactService;
+import org.eclipse.openk.contactbasedata.service.util.SearchContactsFilterParams;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -52,15 +53,22 @@
             @RequestParam( "moduleName") Optional<String> moduleName,
             @RequestParam( "withoutAssignedModule") Optional<Boolean> withoutAssignedModule,
             @RequestParam( "expiringDataInPast" ) Optional<Boolean> expiringDataInPast,
+            @RequestParam( "deletionLockExceeded") Optional<Boolean> delLockExceeded,
+            @RequestParam( "showAnonymized" ) Optional<Boolean> showAnonymized,
             @PageableDefault( sort = {"name"}, size = 20, direction = ASC) Pageable pageable ) {
+
+        SearchContactsFilterParams filter = new SearchContactsFilterParams();
+        filter.setContactType(contactType.orElse(null));
+        filter.setPersonTypeUuid(personTypeUuid.orElse(null));
+        filter.setSearchText(searchText.orElse(null));
+        filter.setModuleName(moduleName.orElse(null));
+        filter.setWithoutModule(withoutAssignedModule.orElse(Boolean.FALSE));
+        filter.setExpiringDataInPast(expiringDataInPast.orElse(Boolean.FALSE));
+        filter.setDelLockExceeded(delLockExceeded.orElse(Boolean.FALSE));
+        filter.setShowAnonymized(showAnonymized.orElse(Boolean.FALSE));
+
         return contactService.findDetailedContacts(
-                contactType.orElse(null),
-                personTypeUuid.orElse(null),
-                searchText.orElse( null),
-                moduleName.orElse(null),
-                withoutAssignedModule.orElse(Boolean.FALSE),
-                expiringDataInPast.orElse(Boolean.FALSE),
-                pageable);
+                filter, 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 e679c4f..f0ab807 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/DetailedContactRepository.java
@@ -34,17 +34,24 @@
             + " 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 "
+            + " and (COALESCE(:filterExpiringDate) = false or COALESCE(:filterExpiringDate) = true 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 )))"
+            + " and (COALESCE(:filterDelLockExceeded) = false or COALESCE(:filterDelLockExceeded) = true and dc.fkContactId in "
+            + "        (select distinct amc.tblContact.id from TblAssignmentModulContact amc where "
+            + "         amc.deletionLockUntil is not null and amc.deletionLockUntil < :dateTimeNow ))"
+            + " and (COALESCE(:showAnonymized) = false or COALESCE(:showAnonymized) = true and dc.anonymized = true)"
     )
-    Page<VwDetailedContact> findByFilter(@Param("contactType")String contactType,
+    Page<VwDetailedContact> findByFilter(@Param("contactType")String contactType, // NOSONAR _fd 07.02.2020 moving to a param object will not increase the readability here!
                                          @Param("personType") UUID personType,
                                          @Param("searchText") String searchText,
                                          @Param("moduleName") String moduleName,
                                          @Param("withoutModule") boolean withoutModule,
                                          @Param("dateTimeNow") Date dateTimeNow,
+                                         @Param("filterExpiringDate") boolean filterExpiringDate,
+                                         @Param("filterDelLockExceeded") boolean filterDelLockExceeded,
+                                         @Param("showAnonymized") boolean showAnonymized,
                                          Pageable pageable);
 }
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/AssignmentModulContactService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/AssignmentModulContactService.java
index bd5ce40..f76429d 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/AssignmentModulContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AssignmentModulContactService.java
@@ -29,6 +29,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.Instant;
+import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -73,6 +75,7 @@
         TblAssignmentModulContact assignmentToSave = assignmentModulContactMapper.toTblAssignmentModulContact(assignmentDto);
         assignmentToSave.setUuid(UUID.randomUUID());
         assignmentToSave.setTblContact(tblContact);
+        assignmentToSave.setAssignmentDate(Date.from(Instant.now()));
 
         if ( !checkUniqueAssignmentForContactAndModuleForInsert(tblContact.getId(), assignmentDto.getModulName())) {
             throw new OperationDeniedException(OperationType.INSERT, "assignment.already.existing");
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 4dbe779..4092fb5 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactService.java
@@ -19,6 +19,7 @@
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.repository.ContactRepository;
 import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
+import org.eclipse.openk.contactbasedata.service.util.SearchContactsFilterParams;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -26,7 +27,6 @@
 
 import java.time.Instant;
 import java.util.Date;
-import java.util.UUID;
 
 @Log4j2
 @Service
@@ -38,31 +38,20 @@
     @Autowired
     private ContactMapper contactMapper;
 
-    public Page<VwDetailedContact> findDetailedContacts(String contactType,
-                                                        UUID personTypeUuid,
-                                                        String searchText,
-                                                        String moduleName,
-                                                        boolean withoutModule,
-                                                        boolean expiringDataInPast,
-                                                        Pageable pageable) {
-
-        if( contactType == null &&
-                personTypeUuid == null &&
-                searchText == null &&
-                moduleName == null &&
-                !withoutModule &&
-                !expiringDataInPast ) {
-            return detailedContactRepository.findAll(pageable);
-        }
-        else {
-            return detailedContactRepository.findByFilter( contactType,
-                    personTypeUuid,
-                    searchText != null ? searchText.toUpperCase() : null,
-                    moduleName,
-                    withoutModule,
-                    expiringDataInPast ? Date.from(Instant.now()) : null,
+    public Page<VwDetailedContact> findDetailedContacts(
+            SearchContactsFilterParams searchContactsFilterParams,
+            Pageable pageable) {
+            return detailedContactRepository.findByFilter(
+                    searchContactsFilterParams.getContactType(),
+                    searchContactsFilterParams.getPersonTypeUuid(),
+                    searchContactsFilterParams.getSearchText() != null ? searchContactsFilterParams.getSearchText().toUpperCase() : null,
+                    searchContactsFilterParams.getModuleName(),
+                    searchContactsFilterParams.isWithoutModule(),
+                    Date.from(Instant.now()),
+                    searchContactsFilterParams.isExpiringDataInPast(),
+                    searchContactsFilterParams.isDelLockExceeded(),
+                    searchContactsFilterParams.isShowAnonymized(),
                     pageable);
-        }
     }
 
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/util/SearchContactsFilterParams.java b/src/main/java/org/eclipse/openk/contactbasedata/service/util/SearchContactsFilterParams.java
new file mode 100644
index 0000000..61a11e5
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/util/SearchContactsFilterParams.java
@@ -0,0 +1,19 @@
+package org.eclipse.openk.contactbasedata.service.util;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.UUID;
+
+@Data
+@NoArgsConstructor
+public class SearchContactsFilterParams {
+    private String contactType;
+    private UUID personTypeUuid;
+    private String searchText;
+    private String moduleName;
+    private boolean withoutModule;
+    private boolean expiringDataInPast;
+    private boolean delLockExceeded;
+    private boolean showAnonymized;
+}
diff --git a/src/main/resources/db/migration/V0_13__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_13__CREATE_CBD_DB.sql
index d83d9ec..6406c0c 100644
--- a/src/main/resources/db/migration/V0_13__CREATE_CBD_DB.sql
+++ b/src/main/resources/db/migration/V0_13__CREATE_CBD_DB.sql
@@ -112,8 +112,8 @@
 INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( '8963aa38-d021-4dc9-bd70-d3734ccd20c4', 'I_P', 'internal person 2 (id=6)', null );
 INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( 'c862d604-5766-43d6-a7e8-a4bac2bd01e1', 'E_P', 'external person 1 (id=7)', null );
 INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( 'fa3d981b-a7d6-4965-a623-cdbc69404153', 'E_P', 'external person 2 (id=8)', null );
-INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( 'ceba21e9-e685-483b-840e-ad167860a696', 'COM', 'anonymous company A (id=9)', null );
-INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( '7889c814-9752-4e4e-a9fe-b46f36a38ccd', 'COM', 'anonymous company B (id=10)', null );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( 'ceba21e9-e685-483b-840e-ad167860a696', 'COM', 'anonymous company A (id=9)', true );
+INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( '7889c814-9752-4e4e-a9fe-b46f36a38ccd', 'COM', 'anonymous company B (id=10)', true );
 INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( '618a01a3-f348-44cc-9ddd-c9df946b0212', 'C_P', 'anoymous contact person A1 (id=11)', true );
 INSERT INTO public.TBL_CONTACT (UUID, CONTACT_TYPE, NOTE, ANONYMIZED) VALUES ( '4ed82474-3878-457a-baef-c28b8e486f25', 'C_P', 'anoymous contact persion A2 (id=12)', true );
 
@@ -543,7 +543,7 @@
 GRANT ALL ON TABLE public.tbl_assignment_modul_contact TO cbd_service;
 
 INSERT INTO public.tbl_assignment_modul_contact(uuid, fk_contact_id, modul_name, assignment_date, expiring_date, deletion_lock_until, assignment_note) VALUES ( 'dfc2979c-40e3-11ea-b77f-2e728ce88125', 1, 'Betriebstagebuch', '2020-01-19 10:23:54', '2021-01-19 00:00:00', '2021-01-19 00:00:00', 'seit Januar zugeordnet');
-INSERT INTO public.tbl_assignment_modul_contact(uuid, fk_contact_id, modul_name, assignment_date, expiring_date, deletion_lock_until, assignment_note) VALUES ( '4009bce2-40e5-11ea-b77f-2e728ce88125', 1, 'Störinfos', '2020-02-27 10:23:54', '2021-02-27 00:00:00', '2021-02-27 00:00:00', 'seit Februar zugeordnet');
+INSERT INTO public.tbl_assignment_modul_contact(uuid, fk_contact_id, modul_name, assignment_date, expiring_date, deletion_lock_until, assignment_note) VALUES ( '4009bce2-40e5-11ea-b77f-2e728ce88125', 1, 'Störinfos', '2020-02-27 10:23:54', '2019-02-27 00:00:00', '2019-02-27 00:00:00', 'seit Februar zugeordnet');
 
 -- -------------------------------------
 -- VIEWS -------------------------------
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 841fe76..86db98c 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/controller/ContactControllerTest.java
@@ -17,6 +17,7 @@
 import org.eclipse.openk.contactbasedata.ContactBaseDataApplication;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.service.ContactService;
+import org.eclipse.openk.contactbasedata.service.util.SearchContactsFilterParams;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,7 +31,7 @@
 import org.springframework.test.web.servlet.MockMvc;
 
 import static org.hamcrest.Matchers.is;
-import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@@ -53,8 +54,7 @@
     public void shouldReturnAllContacts() throws Exception {
         Page<VwDetailedContact> retPage = MockDataHelper.mockVDetailedContactPage();
 
-        when(contactService.findDetailedContacts(
-                isNull(), isNull(), isNull(), isNull(), anyBoolean(), anyBoolean(), any(Pageable.class))).thenReturn(retPage);
+        when(contactService.findDetailedContacts(any(SearchContactsFilterParams.class), 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 f3ed1c4..d968cb4 100644
--- a/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
+++ b/src/test/java/org/eclipse/openk/contactbasedata/service/ContactServiceTest.java
@@ -17,6 +17,7 @@
 import org.eclipse.openk.contactbasedata.config.TestConfiguration;
 import org.eclipse.openk.contactbasedata.model.VwDetailedContact;
 import org.eclipse.openk.contactbasedata.repository.DetailedContactRepository;
+import org.eclipse.openk.contactbasedata.service.util.SearchContactsFilterParams;
 import org.eclipse.openk.contactbasedata.support.MockDataHelper;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,8 +49,9 @@
     public void shouldFindDetailedContactsProperly() {
         Page<VwDetailedContact> mockPaged = MockDataHelper.mockVDetailedContactPage();
         when(detailedContactRepository.findAll(any(Pageable.class))).thenReturn(mockPaged);
+        SearchContactsFilterParams filter = new SearchContactsFilterParams();
         Page<VwDetailedContact> retPage = contactService.findDetailedContacts(
-                null, null, null, null, false, false, PageRequest.of(0, 20));
+                filter, PageRequest.of(0, 20));
 
         assertEquals(mockPaged.getTotalElements(), retPage.getTotalElements());
     }