From 8d5d650e6e0b44b2801a1fd341950a1fb87a0815 Mon Sep 17 00:00:00 2001
From: Johannes Hoermann <j.hoermann@adito.de>
Date: Mon, 1 Jul 2019 15:14:12 +0200
Subject: [PATCH] Webservice

---
 process/DSGVO_lib/process.js        | 374 ++++++++++++++++++++++++++++
 process/WsValidation_lib/process.js |   6 +-
 2 files changed, 377 insertions(+), 3 deletions(-)
 create mode 100644 process/DSGVO_lib/process.js

diff --git a/process/DSGVO_lib/process.js b/process/DSGVO_lib/process.js
new file mode 100644
index 0000000000..1e7b8df70e
--- /dev/null
+++ b/process/DSGVO_lib/process.js
@@ -0,0 +1,374 @@
+import("Attribute_lib");
+import("system.logging");
+import("Keyword_lib")
+import("KeywordRegistry_basic");
+import("system.translate");
+import("Sql_lib");
+import("system.util");
+import("system.vars");
+import("system.db");
+import("system.neon");
+import("system.result");
+import("Report_lib");
+
+// TODO Funktionen aus Adito5 übernehmen und anpassen
+
+
+function getDSGVOTypes (pPerson, pTablename)
+{
+    var res = [];
+    
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+    
+    if (tablename == "Adressen")
+    {
+        // TODO liefert aktuell nur eine Privatadresse, wenn mehrere Vorhanden und keine Firmenadresse
+        // Bsp Birgit Leicht
+
+        var addr = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDR_TYPE from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID ", 
+                "1 = 1", "group by ADDR_TYPE"));
+
+        addr.forEach(function (row)
+        {
+            res.push([row[0], KeywordUtils.getViewValue($KeywordRegistry.addressType(), row)]);
+        });
+        return res;
+    } else if(tablename == "Kommunikationsdaten")
+    {
+        var comm = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select MEDIUM_ID from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", 
+                "1 = 1", "group by MEDIUM_ID"));
+
+        comm.forEach(function (row)
+        {
+            res.push([row[0], KeywordUtils.getViewValue($KeywordRegistry.communicationMedium(), row)]);
+        });
+        return res;
+    }else if(tablename == "Eigenschaft")
+    {
+        res.push(["34c2ddb4-97ce-4683-a067-89a38643ecae", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "34c2ddb4-97ce-4683-a067-89a38643ecae")]);
+        return res;
+    }else if(tablename == "Persönliche Daten")
+    {
+        res.push(["dcc34a11-c86b-4acd-9987-e88c98b5b4c5", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "dcc34a11-c86b-4acd-9987-e88c98b5b4c5")]);
+        res.push(["c626726a-a696-4926-9b0f-c320c410463e", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "c626726a-a696-4926-9b0f-c320c410463e")]);
+        return res;
+    }
+    
+    return res;
+}
+
+function getDSGVOValues(pPerson, pTablename, pType)
+{
+    var res = [];
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+
+    if (tablename == "Adressen")
+    {
+        var addr = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDRESSID, ADDRESS, ADDRESSADDITION, ADDRIDENTIFIER, " 
+                + "BUILDINGNO, CITY, COUNTRY, DISTRICT, REGION, STATE, ZIP, ADDR_TYPE " 
+                + "from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID", "1 = 1"));
+        
+        var addrVal = "";
+        
+        addr.forEach(function (addrRow)
+        {
+            if(pType == addrRow[11])
+                    addrVal = addrRow[1] + " " + addrRow[2] + " " + addrRow[3] + " "+ addrRow[4] + " " + 
+                        addrRow[5] + " " + addrRow[6] + " " + addrRow[7] + " " + 
+                        addrRow[8] + " " + addrRow[9] + " " + addrRow[10];
+                    res.push([addrRow[0], addrVal]);
+        });
+        return res;
+    }else if(tablename == "Kommunikationsdaten")
+    {
+        var comm = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select COMMUNICATIONID, ADDR, MEDIUM_ID " 
+                + "from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", "1 = 1"));
+
+        comm.forEach(function (entry)
+        {
+            if(pType == entry[2])
+                res.push([entry[2], entry[1]]);
+        });
+    }else if(tablename == "Eigenschaft")
+    {
+        var attr = AttributeRelationUtils.getAllAttributes(pPerson, "Person");
+        logging.log(attr);
+        /*attr.forEach(function (entry)
+        {
+            // TODO muss erst attr was liefern, --> leer
+            res.push(["", ""]);
+        })*/
+        
+          // Keyword KeyId: ["34c2ddb4-97ce-4683-a067-89a38643ecae", KeywordUtils.getViewValue($KeywordRegistry.DSGVOType(), "34c2ddb4-97ce-4683-a067-89a38643ecae")]);
+
+        return res;
+    }else if(tablename == "Persönliche Daten")
+    {
+        
+        var pers = db.table(SqlCondition.begin()
+            .andPrepare("PERSON.PERSONID", pPerson)
+            .buildSql("select PERSONID, DATEOFBIRTH, FIRSTNAME, MIDDLENAME, LASTNAME, " 
+                + "GENDER, SALUTATION, TITLE, TITLESUFFIX, PICTURE "
+            + "from PERSON", "1 = 1"));
+        
+        switch (pType)
+        {
+            case "dcc34a11-c86b-4acd-9987-e88c98b5b4c5": // names
+                res.push(["dcc34a11-c86b-4acd-9987-e88c98b5b4c5", (pers[0][6] + " " + pers[0][7] + " " + pers[0][8] + " " + pers[0][2] + " " + pers[0][3] + " " + pers[0][4])]);
+                return res;
+            case "c626726a-a696-4926-9b0f-c320c410463e": // Sonstige Persönliche Daten
+                res.push(["c626726a-a696-4926-9b0f-c320c410463e", (pers[0][9] + pers[0][1] + ", " + pers[0][5])]);
+                return res;
+        }
+    }
+    return res;
+    
+}
+
+function getSpecificRowId(pPerson, pTablename)
+{
+    var tablename = KeywordUtils.getViewValue($KeywordRegistry.DSGVOTablename(), pTablename);
+
+    if (tablename == "Adressen")
+    {
+        return db.cell(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select ADDRESSID from ADDRESS join CONTACT on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID", "1 = 1"));
+    }else if(tablename == "Kommunikationsdaten")
+    {
+        return db.cell(SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPerson)
+            .buildSql("select COMMUNICATIONID from COMMUNICATION join CONTACT on COMMUNICATION.CONTACT_ID = CONTACTID", "1 = 1"));
+    }else if(tablename == "Eigenschaft")
+    {
+        // TODO attribute
+        return "";
+    }else if(tablename == "Persönliche Daten")
+    {
+        return pPerson;
+    }
+    else 
+        return null;
+}
+
+function openDSGVOReport(pPerson, pReportName)
+{
+    var DSGVOReport = new Report(pReportName);
+    
+    // TODO: get Images implementieren
+    var imgData = ["meineFirma | Konrad-Zuse-Straße 4  |  DE 84144 Geisenhausen",
+    "base64:iVBORw0KGgoAAAANSUhEUgAAAM4AAABRCAYAAACaL5lSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDA4QzAyM0IwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA4QzAyM0MwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDhDMDIzOTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDhDMDIzQTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhF3nYoAAAlvSURBVHja7J1fjBXV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"]
+    
+    var dsgvo = SQLCondition.begin().andPrepareValue("DSGVO.CONTACT_ID", pPerson)
+                .buildSql("select DSGVOID, ROW_ID, STATUORITYSOURCE, PURPOSE, TABLENAME, VALID_TO, CONTACT_ID " 
+                    + "from DSGVO", "1 = 1")
+                // getDSGVOTypes / -Values
+    
+    // TODO Parameter und Felder
+    // params: adito.image.myLogo, myAddress, address, salutation, dateRequest, deadline, dateSaveTill, transmission, fromOther
+    // Felder PURPOSE, STATUORITYSOURCE, VALID_TO, TYPE, VALUE
+    
+    var params = {
+        "adito.image.myLogo" : "", 
+        "myAddress" : "", 
+        "address" : "", 
+        "salutation" : "", // ggf. lettersalutation -> Contact
+        "dateRequest" : "", 
+        "deadline" : "",
+        "dateSaveTill" : "",
+        "transmission" : "", 
+        "fromOther" : ""        
+    };
+
+    DSGVOReport.setReportData(ReportData.begin([
+        "PURPOSE",
+        "STATUORITYSOURCE",
+        "VALID_TO",
+        "TYPE",
+        "VALUE"
+        ]));
+    DSGVOReport.addImage("myLogo", imgData[1]);
+    DSGVOReport.addReportParams(params);
+    DSGVOReport.openReport();
+}
+
+
+/**
+ * makes selected data from a private contact anonymous
+ * 
+ * @param pPersId 
+ * @param pContactId 
+ */
+function dsgvoMkDataAnonymous(pPersId, pContactId)
+{       
+    // TODO Only Data that comes from private contacts
+    // TODO ggf. nur ein Param notwendig? oder pRowId statt pPersId
+
+    //Hat die Privat-Person auch eine Funktion an einer Firma
+    var hasFunction         = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.PERSON_ID", pPersId)
+        .andPrepare("CONTACT.ORGANISATION_ID", "0",  "# != ?") // TODO ungleich 0, stimmt das so?
+        .build(" select count(*) from CONTACT", "1=2"));
+    // db.cell(" select count(*) from RELATION where PERS_ID = '" + pPersId + "' and ORGANISATION != '0' ");
+    
+    var prompts             = new Array();
+    prompts["PERSREL"]      = hasFunction;
+    var jsonResult          = openOkCancelDialog("DLG_CHOOSE_DATA_PRIVACY_ANONYMISATION", prompts);
+    var newAnonymCategories = new Array();
+    var updArray            = [];
+    
+    if (jsonResult["button"] != "ok")
+        return;
+  
+    var data, values, columns, columnTypes, condition;
+    
+    //Namen
+    if ((jsonResult["comp.chb_Names"] == "true"))
+    {
+        data                = db.array(db.ROW, SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPersId)
+            .build("select SALUTATION, TITLE, FIRSTNAME, MIDDLENAME, LASTNAME from PERS ", "1=2")
+            );
+        /*data = db.array(db.ROW, "select SALUTATION, TITLE, FIRSTNAME, MIDDLENAME, LASTNAME "
+            + " from PERS "
+            + " where PERSID = '" + pPersId + "'");*/
+        
+        values  = [dsgvoMkTextAnonymous(data[0]), dsgvoMkTextAnonymous(data[1]), dsgvoMkTextAnonymous(data[2]), dsgvoMkTextAnonymous(data[3]), dsgvoMkTextAnonymous(data[4])];
+        columns = ["SALUTATION", "TITLE", "FIRSTNAME", "MIDDLENAME", "LASTNAME"];
+        columnTypes = db.getColumnTypes("PERSON", columns);
+        condition = SqlCondition.andPrepare("PERSONID", pPersId)
+        .and("1=2");        
+        //condition = "PERSONID = '" + pPersId + "'";
+        updArray.push(["PERSON", columns, columnTypes, values, condition])
+        
+        newAnonymCategories.push(translate.text("Namen"));
+    }
+    
+    //sonstige personenbezogene Daten
+    if (jsonResult["comp.chb_others"] == "true") 
+    {
+        data                = db.array(db.ROW, SqlCondition.begin()
+            .andPrepare("CONTACT.PERSON_ID", pPersId)
+            .build("select DOB, GENDER, SUFFIX, PERSINFO from PERS ", "1=2"));
+        
+        /*, "select DOB, GENDER, SUFFIX, PERSINFO "
+            + " from PERS "
+            + " where PERSID = '" + pPersId + "' ")
+        */
+        values  = ["", "", "", ""];
+        columns = ["DOB", "GENDER", "SUFFIX", "PERSINFO"];
+        columnTypes = db.getColumnTypes("PERS", columns);
+        condition = SqlCondition.andPrepare("PERSONID", pPersId)
+        .and("1=2");
+        //condition = "PERSID = '" + pPersId + "'";        
+        updArray.push(["PERS", columns, columnTypes, values, condition])
+        
+        newAnonymCategories.push(translate.text("Sonstige personenbezogene Daten"));
+    }
+
+    //Addressen
+    if(jsonResult["comp.chb_Address"] == "true")
+    {
+        data                = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT_ID", pContactId)
+            .build("select ADDRESS, STATE, CITY, COUNTRY, REGION, BUILDINGNO, ADDRESSADDITION, ZIP, DISTRICT, ADDRESSID "
+                + " from ADDRESS ", "1=2" ));
+        
+        /*" select ADDRESS, STATE, CITY, COUNTRY, REGION, BUILDINGNO, ADDRESSADDITION, ZIP, DISTRICT, ADDRESSID "
+            + " from ADDRESS " 
+            + " where RELATION_ID = '" + pContactId + "' ");
+*/
+        columns = ["ADDRESS", "STATE", "CITY", "COUNTRY", "REGION", "BUILDINGNO", "ADDRESSADDITION", "ZIP", "DISTRICT"];
+        columnTypes = db.getColumnTypes("ADDRESS", columns);
+
+        //Jede Addresse muss separat anonymisiert werden
+        for (let i = 0; i < data.length; i++) {
+            values = [dsgvoMkTextAnonymous(data[i][0]), dsgvoMkTextAnonymous(data[i][1]), 
+            dsgvoMkTextAnonymous(data[i][2]), dsgvoMkTextAnonymous(data[i][3]), 
+            dsgvoMkTextAnonymous(data[i][4]), dsgvoMkTextAnonymous(data[i][5]), 
+            dsgvoMkTextAnonymous(data[i][6]), dsgvoMkTextAnonymous(data[i][7]),
+            dsgvoMkTextAnonymous(data[i][8])];
+            
+            // TODO prüfen
+            condition = SqlCondition.andPrepare("CONTACT_ID", pContactId)
+            .andPrepare("ADDRESSID", data[i][9])
+            .and("1=2");
+            //condition = " CONTACT_ID = '" + pContactId + "' and ADDRESSID = '" + data[i][9] + "' ";
+            updArray.push(["ADDRESS", columns, columnTypes, values, condition]);
+        }
+        newAnonymCategories.push(translate.text("Adressdaten"));
+    }
+    
+    //Kommunikationsdaten
+    if (jsonResult["comp.chb_Comm"] == "true")
+    {
+        data                = db.table(SqlCondition.begin()
+            .andPrepare("CONTACT_ID", pContactId)
+            .build("select ADDRESS, SEARCHADDR, COMMUNICATIONID from COMMUNICATION", "1=2"));
+        //data = db.table("select ADDR, SEARCHADDR, COMMID from COMM where RELATION_ID = '" + pContactId + "'");
+        
+        columns = ["ADDR", "SEARCHADDR"];        
+        columnTypes = db.getColumnTypes("COMM", columns);
+        
+        for (let i = 0; i < data.length; i++) {
+            values = [dsgvoMkTextAnonymous(data[i][0]), dsgvoMkTextAnonymous(data[i][1])];
+
+            condition       = SqlCondition.andPrepare("CONTACT_ID", pContactId)
+            .andPrepare("COMMUNICATIONID", data[i][2]).and("1=2"); 
+            // TODO prüfen
+            //"RELATION_ID = '" + pContactId + "' and COMMID = '" + data[i][2] + "' ";
+            
+            updArray.push(["COMM", columns, columnTypes, values, condition]);            
+        }
+        newAnonymCategories.push(translate.text("Kommunikationsdaten"));
+    }
+    
+    if (updArray.length > 0)
+        db.updates(updArray);
+
+    if(newAnonymCategories.length > 0)
+    {        
+        subject = translate.text("DSGVO Anonymisierung");
+        info    = translate.text("Folgende Daten wurden anonymisiert: " + newAnonymCategories.join(", "));
+        // TODO UX Abwarten
+        question.showMessage(info);
+        newHistory(vars.get("$global.user").relationid, getKeyValue("Intern", "HistoryMedium"), "o", subject, info, [[pContactId, 2]]);
+    }
+    else
+        question.showMessage(translate.text("Es wurden keine Daten anonymisiert."));
+}
+
+/**
+ * utility function to make a String anonymous. Replaces all letters between the first an last one with *
+ * 
+ * @param {String} pText Text to be made anonymous
+ * @return {String} first and last letter from pText with (pText.length-2) stars(*) between them
+ * 
+ * @example dsgvoMkTextAnonymous("Buchstabe")
+ * @exampleresult B*******e
+ */
+function dsgvoMkTextAnonymous(pText)
+{
+    if (pText == null) 
+        return null;
+    if (pText.length <= 2) 
+        return "**";
+    
+    var res = pText.charAt(0);
+    
+    for(i = 0; i < pText.length - 2; i++)
+    {
+        res += "*";
+    }
+    
+    return res += pText.charAt(pText.length - 1);
+}
+
diff --git a/process/WsValidation_lib/process.js b/process/WsValidation_lib/process.js
index e8778ed46b..72d857ec82 100644
--- a/process/WsValidation_lib/process.js
+++ b/process/WsValidation_lib/process.js
@@ -191,7 +191,7 @@ WsValidationType.get = function(pKey)
                     pPlaceData.address.postcode,
                     city,
                     cityext,
-                    pPlaceData.address.country,
+                    pPlaceData.address.country_code,
                     pPlaceData.address.district,
                     pPlaceData.address.state_district,
                     pPlaceData.address.state,
@@ -257,10 +257,10 @@ WsValidationType.get = function(pKey)
     
     function _nominatimRequest(pValue, pCountry)
     {
+        var nominatimCache;
         if (WsValidationUtils.isWsEnabled(this))
         {
             var parameterName = this.additionalInfo;
-            var nominatimCache;
             
             if (!vars.exists("$context.nominatim"))
             {
@@ -326,7 +326,7 @@ WsValidationType.get = function(pKey)
                 }
             }
         }
-        
+        nominatimCache = {}
         nominatimCache.data = this.processResultCallback.call(this, null, pValue);
         vars.set("$context.nominatim", JSON.stringify(nominatimCache)) 
         return nominatimCache.data;
-- 
GitLab