From 93fd6c244b6cdbf2968bbe99111f4efc84173ed9 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Fri, 29 Mar 2019 15:32:40 +0100
Subject: [PATCH] Employee and EmployeeRole

---
 .../_____SYSTEM_APPLICATION_NEON.aod          |   1 +
 .../AttributeRelation_entity.aod              |   6 +
 .../EmployeeRole_entity.aod                   |  50 +++++++++
 .../entityfields/uid/possibleItemsProcess.js  |  10 ++
 .../recordcontainers/jdito/contentProcess.js  |  11 ++
 .../recordcontainers/jdito/onInsert.js        |  22 ++++
 entity/Employee_entity/Employee_entity.aod    | 103 +++++++++++++++++-
 .../objectrowid_param/valueProcess.js         |   4 +
 .../children/objecttype_param/valueProcess.js |   4 +
 .../entityfields/contact_id/onValidation.js   |   0
 .../children/usertitle_param/valueProcess.js  |   4 +
 .../entityfields/firstname/valueProcess.js    |  16 +++
 .../entityfields/image/valueProcess.js        |  15 +++
 .../entityfields/lastname/valueProcess.js     |  16 +++
 .../name_fieldgroup/valueProcess.js           |   4 +
 .../confirm_password => }/onValidation.js     |   3 +-
 .../recordcontainers/jdito/contentProcess.js  |  19 +++-
 .../recordcontainers/jdito/onInsert.js        |  10 +-
 .../recordcontainers/jdito/onUpdate.js        |   9 +-
 .../_____LANGUAGE_EXTRA.aod                   |  18 +++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  19 ++++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  18 +++
 neonContext/EmployeeRole/EmployeeRole.aod     |  12 ++
 .../EmployeeEdit_view/EmployeeEdit_view.aod   |   8 ++
 .../EmployeeFilter_view.aod                   |   5 +
 .../EmployeeMain_view/EmployeeMain_view.aod   |  10 ++
 .../EmployeePreview_view.aod                  |  25 ++++-
 .../EmployeeRoleFilter_view.aod               |  23 ++++
 28 files changed, 424 insertions(+), 21 deletions(-)
 create mode 100644 entity/EmployeeRole_entity/EmployeeRole_entity.aod
 create mode 100644 entity/EmployeeRole_entity/entityfields/uid/possibleItemsProcess.js
 create mode 100644 entity/EmployeeRole_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/EmployeeRole_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/contact_id/onValidation.js
 create mode 100644 entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/firstname/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/image/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/lastname/valueProcess.js
 create mode 100644 entity/Employee_entity/entityfields/name_fieldgroup/valueProcess.js
 rename entity/Employee_entity/{entityfields/confirm_password => }/onValidation.js (52%)
 create mode 100644 neonContext/EmployeeRole/EmployeeRole.aod
 create mode 100644 neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index daae7fbe27d..74af7250a3e 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -32,6 +32,7 @@
         <node name="Attribute" kind="10077" />
         <node name="KeywordEntry" kind="10077" />
         <node name="KeywordAttribute" kind="10077" />
+        <node name="Employee" kind="10077" />
         <node name="INTERNAL_ADMINISTRATOR" kind="159" />
       </node>
     </node>
diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index 2821c0bf012..118e70579db 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -99,6 +99,12 @@
           <fieldName>Attributes</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>cb20be7b-35aa-43c7-bf98-3a31010b33d6</name>
+          <entityName>Employee_entity</entityName>
+          <fieldName>Attributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityParameter>
diff --git a/entity/EmployeeRole_entity/EmployeeRole_entity.aod b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
new file mode 100644
index 00000000000..fa71af3a049
--- /dev/null
+++ b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.0">
+  <name>EmployeeRole_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+      <title>Role</title>
+      <possibleItemsProcess>%aditoprj%/entity/EmployeeRole_entity/entityfields/uid/possibleItemsProcess.js</possibleItemsProcess>
+    </entityField>
+    <entityParameter>
+      <name>UserTitle_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityProvider>
+      <name>EmployeeRoles</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>3bcec57a-7165-4773-9253-5ecab26ee3f4</name>
+          <entityName>Employee_entity</entityName>
+          <fieldName>EmployeeRoles</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>UserTitle_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/EmployeeRole_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/EmployeeRole_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFields>
+        <element>UID.value</element>
+      </recordFields>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/EmployeeRole_entity/entityfields/uid/possibleItemsProcess.js b/entity/EmployeeRole_entity/entityfields/uid/possibleItemsProcess.js
new file mode 100644
index 00000000000..a9b4b9a616d
--- /dev/null
+++ b/entity/EmployeeRole_entity/entityfields/uid/possibleItemsProcess.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.tools");
+
+var roles = [];
+var allRoles = tools.getAllRoles([tools.ROLE_INTERNAL, tools.ROLE_PROJECT, tools.ROLE_XMPP]);
+
+for (let roleId in allRoles)
+    roles.push([roleId, allRoles[roleId][0]])
+
+result.object(roles);
\ No newline at end of file
diff --git a/entity/EmployeeRole_entity/recordcontainers/jdito/contentProcess.js b/entity/EmployeeRole_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..9f314aac5db
--- /dev/null
+++ b/entity/EmployeeRole_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.vars");
+import("system.tools");
+
+var roles = [];
+var userTitle = vars.exists("$param.UserTitle_param") && vars.get("$param.UserTitle_param");
+
+if (userTitle)
+    roles = tools.getRoles(userTitle).map(function (role) {return [role]});
+
+result.object(roles);
\ No newline at end of file
diff --git a/entity/EmployeeRole_entity/recordcontainers/jdito/onInsert.js b/entity/EmployeeRole_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..bd399bd50cb
--- /dev/null
+++ b/entity/EmployeeRole_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,22 @@
+import("system.result");
+import("system.vars");
+import("system.tools");
+
+var userTitle = vars.exists("$param.UserTitle_param") && vars.get("$param.UserTitle_param");
+var role = vars.get("$field.UID");
+
+if (userTitle)
+{    
+    var user = tools.getUser(userTitle);
+    var roles = tools.getRoles(userTitle);
+    var roleObj = {};
+    roles = [role].concat(roles)
+        .filter(function (role) 
+        {
+            roleObj[role] = true;
+            return !(role in roleObj);
+        });
+    user[tools.ROLES] = roles;
+    
+    tools.updateUser(user);
+}
\ No newline at end of file
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index 80c05d8fb1d..f79dd76e4da 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -3,6 +3,7 @@
   <name>Employee_entity</name>
   <title>Employee</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <onValidation>%aditoprj%/entity/Employee_entity/onValidation.js</onValidation>
   <iconId>VAADIN:GROUP</iconId>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -11,23 +12,30 @@
     </entityProvider>
     <entityField>
       <name>UID</name>
+      <searchable v="false" />
     </entityField>
     <entityField>
       <name>TITLE</name>
-      <title>Title</title>
+      <title>Login</title>
       <mandatory v="true" />
       <onValidation>%aditoprj%/entity/Employee_entity/entityfields/title/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>CONTACT_ID</name>
+      <title>Person</title>
+      <consumer>Contacts</consumer>
+      <mandatory v="false" />
+      <onValidation>%aditoprj%/entity/Employee_entity/entityfields/contact_id/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>FIRSTNAME</name>
       <title>Firstname</title>
+      <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/firstname/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>LASTNAME</name>
       <title>Lastname</title>
+      <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/lastname/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>ISACTIVE</name>
@@ -38,30 +46,114 @@
     </entityField>
     <entityField>
       <name>EMAIL_ADDRESS</name>
-      <title>Email address</title>
+      <title>Email</title>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>PASSWORD</name>
       <title>Password</title>
       <contentType>PASSWORD</contentType>
+      <searchable v="false" />
     </entityField>
     <entityField>
       <name>CONFIRM_PASSWORD</name>
       <title>Confirm password</title>
       <contentType>PASSWORD</contentType>
-      <onValidation>%aditoprj%/entity/Employee_entity/entityfields/confirm_password/onValidation.js</onValidation>
+      <searchable v="false" />
     </entityField>
     <entityActionField>
       <name>setPassword</name>
       <fieldType>ACTION</fieldType>
-      <title>Set Password</title>
+      <title>Set password</title>
       <onActionProcess>%aditoprj%/entity/Employee_entity/entityfields/setpassword/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:PASSWORD</iconId>
     </entityActionField>
     <entityParameter>
       <name>passwordChange_param</name>
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
+    <entityParameter>
+      <name>onlyActives_param</name>
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityConsumer>
+      <name>Contacts</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Attributes</name>
+      <title>Attributes</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>RelationsForSpecificObject</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityFieldGroup>
+      <name>NAME_fieldGroup</name>
+      <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/name_fieldgroup/valueProcess.js</valueProcess>
+      <title>Name</title>
+      <description>FIELDGROUP</description>
+      <fields>
+        <element>FIRSTNAME</element>
+        <element>LASTNAME</element>
+      </fields>
+    </entityFieldGroup>
+    <entityField>
+      <name>IMAGE</name>
+      <contentType>IMAGE</contentType>
+      <searchable v="false" />
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/image/valueProcess.js</valueProcess>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>DEPARTMENT</name>
+      <title>Department</title>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+      <contentType>LONG_TEXT</contentType>
+    </entityField>
+    <entityField>
+      <name>ROLES</name>
+    </entityField>
+    <entityConsumer>
+      <name>EmployeeRoles</name>
+      <title>Roles</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>EmployeeRole_entity</entityName>
+        <fieldName>EmployeeRoles</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>UserTitle_param</name>
+          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -78,6 +170,9 @@
         <element>FIRSTNAME.value</element>
         <element>LASTNAME.value</element>
         <element>EMAIL_ADDRESS.value</element>
+        <element>DESCRIPTION.value</element>
+        <element>CONTACT_ID.value</element>
+        <element>CONTACT_ID.displayValue</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js b/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
new file mode 100644
index 00000000000..24b12e282d0
--- /dev/null
+++ b/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js b/entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..5996e99db23
--- /dev/null
+++ b/entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/contact_id/onValidation.js b/entity/Employee_entity/entityfields/contact_id/onValidation.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js b/entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js
new file mode 100644
index 00000000000..8277e40dbed
--- /dev/null
+++ b/entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.TITLE"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/firstname/valueProcess.js b/entity/Employee_entity/entityfields/firstname/valueProcess.js
new file mode 100644
index 00000000000..7558bfe9497
--- /dev/null
+++ b/entity/Employee_entity/entityfields/firstname/valueProcess.js
@@ -0,0 +1,16 @@
+import("system.result");
+import("system.db");
+import("system.neon");
+import("system.vars");
+import("Sql_lib");
+
+var contactId = vars.get("$field.CONTACT_ID");
+if ((vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT)
+    && contactId)
+{
+    var firstname = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.CONTACTID", contactId)
+        .buildSql("select FIRSTNAME from PERSON join CONTACT on CONTACT.PERSON_ID = PERSON.PERSONID")
+    );
+    result.string(firstname);
+}
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/image/valueProcess.js b/entity/Employee_entity/entityfields/image/valueProcess.js
new file mode 100644
index 00000000000..4701975fe7b
--- /dev/null
+++ b/entity/Employee_entity/entityfields/image/valueProcess.js
@@ -0,0 +1,15 @@
+import("system.db");
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("Person_lib");
+import("Sql_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW)
+{   
+    var personId = db.cell(SqlCondition.begin()
+        .andPrepareVars("CONTACT.CONTACTID", "$field.CONTACT_ID")
+        .buildSql("select PERSON_ID from CONTACT")
+    );
+    result.string(PersUtils.getImage(personId, (vars.getString("$field.FIRSTNAME") + " " + vars.getString("$field.LASTNAME")).trim()));
+}
diff --git a/entity/Employee_entity/entityfields/lastname/valueProcess.js b/entity/Employee_entity/entityfields/lastname/valueProcess.js
new file mode 100644
index 00000000000..919ab803745
--- /dev/null
+++ b/entity/Employee_entity/entityfields/lastname/valueProcess.js
@@ -0,0 +1,16 @@
+import("system.result");
+import("system.db");
+import("system.neon");
+import("system.vars");
+import("Sql_lib");
+
+var contactId = vars.get("$field.CONTACT_ID");
+if ((vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT)
+    && contactId)
+{
+    var lastname = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.CONTACTID", contactId)
+        .buildSql("select LASTNAME from PERSON join CONTACT on CONTACT.PERSON_ID = PERSON.PERSONID")
+    );
+    result.string(lastname);
+}
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/name_fieldgroup/valueProcess.js b/entity/Employee_entity/entityfields/name_fieldgroup/valueProcess.js
new file mode 100644
index 00000000000..2cb5fabc542
--- /dev/null
+++ b/entity/Employee_entity/entityfields/name_fieldgroup/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string((vars.get("$field.FIRSTNAME") + " " + vars.get("$field.LASTNAME")).trim());
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/confirm_password/onValidation.js b/entity/Employee_entity/onValidation.js
similarity index 52%
rename from entity/Employee_entity/entityfields/confirm_password/onValidation.js
rename to entity/Employee_entity/onValidation.js
index f4f7551118f..1ade64458c9 100644
--- a/entity/Employee_entity/entityfields/confirm_password/onValidation.js
+++ b/entity/Employee_entity/onValidation.js
@@ -1,7 +1,6 @@
 import("system.translate");
 import("system.result");
 import("system.vars");
-import("Entity_lib");
 
-if (vars.get("$field.PASSWORD") != ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONFIRM_PASSWORD")))
+if (vars.get("$field.PASSWORD") != vars.get("$field.CONFIRM_PASSWORD"))
     result.string(translate.text("Password and confirmation must be the same!"));
\ No newline at end of file
diff --git a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
index 8a479d6601b..71470598bf4 100644
--- a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.vars");
 import("system.result");
 import("system.tools");
@@ -12,13 +13,19 @@ users = users.map(function (user)
 {
     user = tools.getUser(user);
     return [
-        user.title,
-        user.title,
-        user.params.isActive,
-        user.params.firstname,
-        user.params.lastname,
-        user.params.email
+        user[tools.TITLE],
+        user[tools.TITLE],
+        user[tools.PARAMS][tools.ISACTIVE],
+        user[tools.PARAMS][tools.FIRSTNAME],
+        user[tools.PARAMS][tools.LASTNAME],
+        user[tools.PARAMS][tools.EMAIL],
+        user[tools.PARAMS][tools.DESCRIPTION],
+        user[tools.PARAMS][tools.CONTACTID],
+        user[tools.PARAMS][tools.CONTACTID]
     ];
 });
 
+var filter = vars.exists("$local.filter") && vars.get("$local.filter");
+//logging.log(filter)
+
 result.object(users);
\ No newline at end of file
diff --git a/entity/Employee_entity/recordcontainers/jdito/onInsert.js b/entity/Employee_entity/recordcontainers/jdito/onInsert.js
index a82eeac785c..85d0821c80d 100644
--- a/entity/Employee_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Employee_entity/recordcontainers/jdito/onInsert.js
@@ -2,10 +2,12 @@ import("system.vars");
 import("system.tools");
 
 var user = {};
-var parameters = []; //this has to be an array
-parameters[tools.FIRSTNAME] = vars.get("$field.FIRSTNAME");
-parameters[tools.LASTNAME] = vars.get("$field.LASTNAME");
-parameters[tools.EMAIL] = vars.get("$field.EMAIL_ADDRESS");
+var params = []; //this has to be an array
+params[tools.FIRSTNAME] = vars.get("$field.FIRSTNAME");
+params[tools.LASTNAME] = vars.get("$field.LASTNAME");
+params[tools.EMAIL] = vars.get("$field.EMAIL_ADDRESS");
+params[tools.CALENDARID] = vars.get("$field.EMAIL_ADDRESS");
+params[tools.CONTACTID] = vars.get("$field.CONTACT_ID");
 
 user[tools.TITLE] = vars.get("$field.TITLE");
 user[tools.PARAMS] = params;
diff --git a/entity/Employee_entity/recordcontainers/jdito/onUpdate.js b/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
index 0e94ccf1fc5..7d445e24742 100644
--- a/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
@@ -1,11 +1,14 @@
+import("system.logging");
 import("system.vars");
 import("system.tools");
 
 var user = tools.getUser(vars.get("$field.TITLE"));
 
-user.params[tools.FIRSTNAME] = vars.get("$field.FIRSTNAME");
-user.params[tools.LASTNAME] = vars.get("$field.LASTNAME");
-user.params[tools.EMAIL] = vars.get("$field.EMAIL_ADDRESS");
+user[tools.PARAMS][tools.FIRSTNAME] = vars.get("$field.FIRSTNAME");
+user[tools.PARAMS][tools.LASTNAME] = vars.get("$field.LASTNAME");
+user[tools.PARAMS][tools.EMAIL] = vars.get("$field.EMAIL_ADDRESS");
+user[tools.PARAMS][tools.CALENDARID] = vars.get("$field.EMAIL_ADDRESS");
+user[tools.PARAMS][tools.CONTACTID] = vars.get("$field.CONTACT_ID");
 
 if (vars.exists("$param.passwordChange_param") && vars.get("$param.passwordChange_param") 
     && vars.get("$field.PASSWORD") == vars.get("$field.CONFIRM_PASSWORD"))
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index a0f27879af9..d9b394cbcbd 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2655,6 +2655,18 @@
     <entry>
       <key>${MIN_MAX_ERROR} field: %0, value: %1, min: %2, max: %3</key>
     </entry>
+    <entry>
+      <key>The title already exists!</key>
+    </entry>
+    <entry>
+      <key>Password</key>
+    </entry>
+    <entry>
+      <key>Confirm password</key>
+    </entry>
+    <entry>
+      <key>Set password</key>
+    </entry>
     <entry>
       <key>Email</key>
     </entry>
@@ -2673,6 +2685,12 @@
     <entry>
       <key>{$OBJECTLINK_OBJECT}</key>
     </entry>
+    <entry>
+      <key>Roles</key>
+    </entry>
+    <entry>
+      <key>standard phone</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index f8e2253344b..c9c66d90bf5 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,6 +10,10 @@
       <key>Company</key>
       <value>Firma</value>
     </entry>
+    <entry>
+      <key>Confirm password</key>
+      <value>Passwort bestätigen</value>
+    </entry>
     <entry>
       <key>Entrydate (Day)</key>
       <value>Eingangsdatum (Tag)</value>
@@ -146,6 +150,10 @@
       <key>Online-Meeting</key>
       <value>Online-Meeting</value>
     </entry>
+    <entry>
+      <key>Set password</key>
+      <value>Passwort setzen</value>
+    </entry>
     <entry>
       <key>Choose address</key>
       <value>Adresse auswählen</value>
@@ -2582,6 +2590,10 @@
       <key>Internal</key>
       <value>intern</value>
     </entry>
+    <entry>
+      <key>Roles</key>
+      <value>Rollen</value>
+    </entry>
     <entry>
       <key>Brunei Darussalam</key>
       <value>Brunei Darussalam</value>
@@ -2710,6 +2722,10 @@
       <key>Hong Kong</key>
       <value>Hongkong</value>
     </entry>
+    <entry>
+      <key>Password</key>
+      <value>Passwort</value>
+    </entry>
     <entry>
       <key>Chad</key>
       <value>Tschad</value>
@@ -3442,6 +3458,9 @@
       <key>{$OBJECTLINK_OBJECT}</key>
       <value>Objekt</value>
     </entry>
+    <entry>
+      <key>standard phone</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 4c8ee3cf901..b30d1356094 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -713,6 +713,9 @@
     <entry>
       <key>Connection</key>
     </entry>
+    <entry>
+      <key>standard phone</key>
+    </entry>
     <entry>
       <key>standard email</key>
     </entry>
@@ -2683,6 +2686,18 @@
       <key>${MIN_MAX_ERROR} field: %0, value: %1, min: %2, max: %3</key>
       <value>%0 has to be between %2 and %3.</value>
     </entry>
+    <entry>
+      <key>The title already exists!</key>
+    </entry>
+    <entry>
+      <key>Password</key>
+    </entry>
+    <entry>
+      <key>Confirm password</key>
+    </entry>
+    <entry>
+      <key>Set password</key>
+    </entry>
     <entry>
       <key>Email</key>
     </entry>
@@ -2703,6 +2718,9 @@
       <key>{$OBJECTLINK_OBJECT}</key>
       <value>Object</value>
     </entry>
+    <entry>
+      <key>Roles</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/EmployeeRole/EmployeeRole.aod b/neonContext/EmployeeRole/EmployeeRole.aod
new file mode 100644
index 00000000000..0cb5fb8242c
--- /dev/null
+++ b/neonContext/EmployeeRole/EmployeeRole.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>EmployeeRole</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>EmployeeRole_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>fd4de342-238b-494e-a85b-ff08e3f065b9</name>
+      <view>EmployeeRoleFilter_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/EmployeeEdit_view/EmployeeEdit_view.aod b/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
index cb955b069aa..61348eb4157 100644
--- a/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
+++ b/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
@@ -21,6 +21,10 @@
           <name>9170856b-45c2-4d8a-864d-4db36bfe4a8c</name>
           <entityField>ISACTIVE</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>1925ef51-54a8-41e2-aa78-6d95d1ee4b99</name>
+          <entityField>CONTACT_ID</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>7d36467f-8b79-4647-b8e5-5759bdbf37a7</name>
           <entityField>FIRSTNAME</entityField>
@@ -33,6 +37,10 @@
           <name>6155e6b7-ee2c-45b4-87f5-9e506ffc5775</name>
           <entityField>EMAIL_ADDRESS</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>8cffaf75-f2dc-42c5-95d7-1ce1e4927d8a</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/EmployeeFilter_view/EmployeeFilter_view.aod b/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
index 42acff8f127..121d76e9307 100644
--- a/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
+++ b/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
@@ -2,6 +2,7 @@
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.0">
   <name>EmployeeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
   <layout>
     <boxLayout>
       <name>layout</name>
@@ -12,6 +13,10 @@
       <name>Employees</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>15185ef0-5402-43c4-b5c9-1e0e836ef1c3</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>3e3552f9-9591-45ae-a0bb-a85210c2b382</name>
           <entityField>TITLE</entityField>
diff --git a/neonView/EmployeeMain_view/EmployeeMain_view.aod b/neonView/EmployeeMain_view/EmployeeMain_view.aod
index 0cceb2165e1..9aa43b4eca4 100644
--- a/neonView/EmployeeMain_view/EmployeeMain_view.aod
+++ b/neonView/EmployeeMain_view/EmployeeMain_view.aod
@@ -14,5 +14,15 @@
       <entityField>#ENTITY</entityField>
       <view>EmployeePreview_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>79a01c28-1eaa-4974-babd-fb6e4d59471b</name>
+      <entityField>EmployeeRoles</entityField>
+      <view>EmployeeRoleFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>7164f8cd-3892-4694-92ad-fc45afac68f1</name>
+      <entityField>Attributes</entityField>
+      <view>AttributeRelationFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/EmployeePreview_view/EmployeePreview_view.aod b/neonView/EmployeePreview_view/EmployeePreview_view.aod
index d18d815697a..2cbb42497cc 100644
--- a/neonView/EmployeePreview_view/EmployeePreview_view.aod
+++ b/neonView/EmployeePreview_view/EmployeePreview_view.aod
@@ -9,9 +9,30 @@
   </layout>
   <children>
     <cardViewTemplate>
-      <name>Card</name>
-      <titleField>TITLE</titleField>
+      <name>Header</name>
+      <iconField>IMAGE</iconField>
+      <titleField>NAME_fieldGroup</titleField>
+      <subtitleField>TITLE</subtitleField>
       <entityField>#ENTITY</entityField>
     </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Info</name>
+      <showDrawer v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>0bda9209-1437-49eb-98b7-6edea9c6836a</name>
+          <entityField>DEPARTMENT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>d9786e3d-5364-4075-a08d-0d4ea91c4728</name>
+          <entityField>EMAIL_ADDRESS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>79cd6a97-6caf-4acb-81af-028b94f33e8f</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod b/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod
new file mode 100644
index 00000000000..1938871992d
--- /dev/null
+++ b/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.0">
+  <name>EmployeeRoleFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <autoNewRow v="true" />
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>ab1c8d39-fc29-42e8-8b8e-3557d544b272</name>
+          <entityField>UID</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
-- 
GitLab