KON-616 Als Administrator möchte ich die Stammdaten auf einer Seite konfigurieren können um nicht zwischen verschiedenen Seiten wechseln zu müssen
KON-613 Als Anwender möchte ich, dass Expandables nur so hoch sind wie es aktuell sichtbare Inhalte erforderlich machen, um unnötige Weißflächen zu vermeiden.
KON-680 LDAP-Synchronisationsnotiz in eigenes Feld packen
diff --git a/deploy/db/04_CR_add_syncotes.sql b/deploy/db/04_CR_add_syncotes.sql
new file mode 100644
index 0000000..f8b1120
--- /dev/null
+++ b/deploy/db/04_CR_add_syncotes.sql
@@ -0,0 +1,18 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+
+alter table tbl_internal_person
+	add column SYNC_NOTE character varying(1024),
+  	add column IS_SYNC_ERROR boolean;
\ No newline at end of file
diff --git a/deploy/db/oracle/03_CR_add_syncotes.sql b/deploy/db/oracle/03_CR_add_syncotes.sql
new file mode 100644
index 0000000..bf5a4d8
--- /dev/null
+++ b/deploy/db/oracle/03_CR_add_syncotes.sql
@@ -0,0 +1,20 @@
+-----------------------------------------------------------------------------------
+-- *******************************************************************************
+-- * Copyright (c) 2019 Contributors to the Eclipse Foundation
+-- *
+-- * See the NOTICE file(s) distributed with this work for additional
+-- * information regarding copyright ownership.
+-- *
+-- * This program and the accompanying materials are made available under the
+-- * terms of the Eclipse Public License v. 2.0 which is available at
+-- * http://www.eclipse.org/legal/epl-2.0.
+-- *
+-- * SPDX-License-Identifier: EPL-2.0
+-- *******************************************************************************
+-----------------------------------------------------------------------------------
+
+ALTER TABLE tbl_internal_person
+ADD (
+  SYNC_NOTE VARCHAR2(1024),
+  IS_SYNC_ERROR NUMBER
+);
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java b/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
index 7423ae2..49af9fc 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/TblInternalPerson.java
@@ -41,6 +41,8 @@
     private String department;
     private String uidIdent;
     private String userRef;
+    private String syncNote;
+    private Boolean isSyncError;
 
 
     @OneToOne
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/AuthNAuthService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/AuthNAuthService.java
index d5c6009..b0ba185 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/AuthNAuthService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/AuthNAuthService.java
@@ -83,6 +83,8 @@
         boolean attributesChanged = false;
         if (keyCloakUserToSync == null) {
             tblInternalPerson.setUserRef(null);
+            log.warn("InternalPerson is not synchronized with Portal anymore, most likely the user was removed from the Portal! /n" +
+                    " Id: " + tblInternalPerson.getId() + " Firstname: " + tblInternalPerson.getFirstName() + " Lastname: " + tblInternalPerson.getLastName());
             attributesChanged = true;
         } else {
             if (!Objects.equals(tblInternalPerson.getFirstName(), keyCloakUserToSync.getFirstName())
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactAnonymizerService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactAnonymizerService.java
index 45feaa4..370116a 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/ContactAnonymizerService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/ContactAnonymizerService.java
@@ -169,7 +169,7 @@
     private static String getContactNote() {
         return new StringBuilder()
                 .append("*** [")
-                .append(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(Date.from(Instant.now())))
+                .append(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(Date.from(Instant.now())))
                 .append("] ***")
                 .toString();
     }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
index 0bf4e5f..675b403 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/InternalPersonService.java
@@ -109,6 +109,8 @@
         existingInternalPerson.setDepartment(internalPersonDto.getDepartment());
         existingInternalPerson.setUidIdent(internalPersonDto.getUid());
         existingInternalPerson.setUserRef(internalPersonDto.getUserRef());
+        existingInternalPerson.setSyncNote(internalPersonDto.getSyncNote());
+        existingInternalPerson.setIsSyncError(internalPersonDto.getIsSyncError());
 
         setFromInternalPersonDto( existingInternalPerson, internalPersonDto );
         internalPersonUpdated = internalPersonRepository.save(existingInternalPerson);
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java
index eb91580..ccfe4a8 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java
@@ -16,7 +16,10 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -31,7 +34,7 @@
 @Service
 public class LdapService {
 
-    @Value("${authnauth-sync.scheduling.enabled}")
+    @Value("${ldap-sync.scheduling.enabled}")
     private Boolean ldapEnabled;
 
     @Value("${ldap-sync.attribute-mapping.uid}")
@@ -122,34 +125,35 @@
     }
 
     private void findExistingAndNotExistingLdapUsers(List<TblInternalPerson> internalPersonList, List<LdapUser> allFoundLdapUsers, List<TblInternalPerson> allNotExistingLdapUsers) {
+        String now = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(Date.from(Instant.now()));
         for (TblInternalPerson tblInternalPerson : internalPersonList) {
             String uidTblInternalPerson = tblInternalPerson.getUidIdent();
             List<LdapUser> ldapUserByUIDResult = getLdapUserByUID(uidTblInternalPerson);
 
             if(ldapUserByUIDResult.isEmpty()){
-                String errorMsg = String.format("[LDAP Sync Error] User with Uid: [ %s ] can not be found in LDAP", uidTblInternalPerson);
-                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
+                String syncMsg = String.format("[LDAP Sync Fehler: %s] User mit der Uid: [ %s ] nicht gefunden im LDAP", now, uidTblInternalPerson);
+                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, syncMsg);
             }
             else if(ldapUserByUIDResult.size() > 1){
-                String errorMsg = String.format("[LDAP Sync Error] More than one result for UID: [ %s ] in LDAP", uidTblInternalPerson);
-                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, errorMsg);
+                String syncMsg = String.format("[LDAP Sync Fehler: %s] Mehr als ein Eintrag für die Uid: [ %s ] im LDAP", now, uidTblInternalPerson);
+                setNoteAndLogSyncError(allNotExistingLdapUsers, tblInternalPerson, syncMsg);
             }
             else {
                 LdapUser ldapUser = ldapUserByUIDResult.get(0);
+                String syncMsg = String.format("[LDAP Sync Erfolg: %s]", now);
+                tblInternalPerson.setSyncNote(syncMsg);
+                tblInternalPerson.setIsSyncError(false);
                 allFoundLdapUsers.add(ldapUser);
             }
         }
     }
 
-    private void setNoteAndLogSyncError(List<TblInternalPerson> allNotExistingLdapUsers, TblInternalPerson tblInternalPerson, String errorMsg) {
-        log.error(errorMsg);
-        String note = tblInternalPerson.getContact().getNote();
-        if (note == null) note = "";
-        if (!note.contains(errorMsg)) {
-            note = note + System.lineSeparator() + errorMsg;
-            tblInternalPerson.getContact().setNote(note);
-            allNotExistingLdapUsers.add(tblInternalPerson);
-        }
+    private void setNoteAndLogSyncError(List<TblInternalPerson> allNotExistingLdapUsers,
+                                        TblInternalPerson tblInternalPerson, String syncMsg) {
+        log.error(syncMsg);
+        tblInternalPerson.setSyncNote(syncMsg);
+        tblInternalPerson.setIsSyncError(true);
+        allNotExistingLdapUsers.add(tblInternalPerson);
     }
 
     private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser, RefCommunicationType refCommunicationTypeMail, RefCommunicationType refCommunicationTypePhone) {
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
index 27969b2..5ff2c38 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/InternalPersonDto.java
@@ -34,6 +34,8 @@
     private String department;
     private String uid;
     private String userRef;
+    private String syncNote;
+    private Boolean isSyncError;
 
     //from Contact
     @JsonProperty("contactId")
diff --git a/src/main/resources/application_localdev.yml b/src/main/resources/application_localdev.yml
index 9c1cb64..06e46ff 100644
--- a/src/main/resources/application_localdev.yml
+++ b/src/main/resources/application_localdev.yml
@@ -38,8 +38,8 @@
     mail-id: 1
     telephone-number-id: 2
   scheduling:
-    enabled: false
-    cron-expression: '*/10 * * * * *'
+    enabled: true
+    cron-expression: '*/20 * * * * *'
 
 authnauth-sync:
   attribute-mapping:
diff --git a/src/main/resources/db/migration/V0_23__CREATE_CBD_DB.sql b/src/main/resources/db/migration/V0_23__CREATE_CBD_DB.sql
index 2b5d3f9..aee5cdd 100644
--- a/src/main/resources/db/migration/V0_23__CREATE_CBD_DB.sql
+++ b/src/main/resources/db/migration/V0_23__CREATE_CBD_DB.sql
@@ -484,6 +484,8 @@
    FK_SALUTATION_ID bigint,
    FK_REF_PERSON_TYPE_ID bigint,
    DEPARTMENT character varying(255),
+   SYNC_NOTE character varying(1024),
+   IS_SYNC_ERROR boolean,
    UID_IDENT character varying(255),
    USER_REF character varying(255),
    FK_CONTACT_ID bigint NOT NULL,
@@ -505,9 +507,9 @@
 CREATE UNIQUE INDEX idx_tbl_internal_person_uid ON public.TBL_INTERNAL_PERSON ( UID_IDENT ASC );
 CREATE UNIQUE INDEX idx_tbl_internal_person_user_ref ON public.TBL_INTERNAL_PERSON ( USER_REF ASC );
 
-INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Pauline', 'Freudenberg', 'B.Sc.', 1, 1,'Abteilung Rechnungsstellung', '66cd78c3-6716-4ab3-b834-a199fc796b88', 'PFREUD',  5);
-INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Bernhardt', 'Iffland', '', 2, 2,'Kreativ', '4124e4e7-3488-4492-bf39-75e6a23a1c1a', 'BIFFL', 6);
-INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Horatio', 'Hornblower', 'Capt.', 1, 2,'Royal Navy', 'hhornblo', 'HORNB', 13);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Pauline', 'Freudenberg', 'B.Sc.', 1, 1,'Abteilung Rechnungsstellung', '66cd78c3-6716-4ab3-b834-a199fc796b88', null,  5);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Bernhardt', 'Iffland', '', 2, 2,'Kreativ', null, 'BIFFL', 6);
+INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Horatio', 'Hornblower', 'Capt.', 1, 2,'Royal Navy', 'hhornblo', null, 13);
 INSERT INTO public.TBL_INTERNAL_PERSON (FIRST_NAME, LAST_NAME, TITLE, FK_SALUTATION_ID, FK_REF_PERSON_TYPE_ID, DEPARTMENT, UID_IDENT, USER_REF, FK_CONTACT_ID) VALUES ( 'Cornelius', 'Buckley', '', 1, 2,'Royal Navy', null, 'BUCKC', 14);
 -- ---------------------------------------------
 -- TABLE TBL_ASSIGNMENT_MODUL_CONTACT