diff --git a/entity/AddressValidation_entity/AddressValidation_entity.aod b/entity/AddressValidation_entity/AddressValidation_entity.aod index 2f0920361f2a176bce413f95eb4144e859a111d7..90c7e6edcbb75846dde3ce3580f4c29cde8798f4 100644 --- a/entity/AddressValidation_entity/AddressValidation_entity.aod +++ b/entity/AddressValidation_entity/AddressValidation_entity.aod @@ -115,14 +115,6 @@ <name>STREET</name> <title>Street</title> </entityField> - <entityField> - <name>FROM_BN</name> - <title>From buildingnumber</title> - </entityField> - <entityField> - <name>TO_BN</name> - <title>To buildingnumber</title> - </entityField> <entityField> <name>LON</name> </entityField> @@ -132,12 +124,17 @@ <entityField> <name>CITYEXT</name> </entityField> + <entityField> + <name>BUILDINGNO</name> + </entityField> </entityFields> <recordContainers> <jDitoRecordContainer> <name>jdito</name> + <jDitoRecordAlias></jDitoRecordAlias> <isFilterable v="true" /> <isRequireContainerFiltering v="true" /> + <isSortable v="true" /> <contentProcess>%aditoprj%/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <recordFieldMappings> <jDitoRecordFieldMapping> @@ -171,10 +168,7 @@ <name>STREET.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>FROM_BN.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>TO_BN.value</name> + <name>BUILDINGNO.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> <name>LON.value</name> @@ -182,9 +176,6 @@ <jDitoRecordFieldMapping> <name>LAT.value</name> </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>VALUE.value</name> - </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js index 084f00d1815908c3c4241fc03c680834e03fc8d5..e8560045975cb9faf78db1adaa945d7db5a940fe 100644 --- a/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js +++ b/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js @@ -1,4 +1,4 @@ -import("WsValidation_lib"); -import("system.result"); - -result.string(WsValidationType.get().TYPE_CITY.key); \ No newline at end of file +import("WsValidation_lib"); +import("system.result"); + +result.string(WsValidationType.get().TYPE_CITY_NOMINATIM.key); \ No newline at end of file diff --git a/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js index a6cfed5664099791a5129bacf8e86b3949a9a2db..daa9b19deddee5a66d9ccbb09e6675cbfba2473c 100644 --- a/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js +++ b/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js @@ -1,4 +1,5 @@ import("WsValidation_lib"); import("system.result"); -result.string(WsValidationType.get().TYPE_ADDRESS.key); \ No newline at end of file +// result.string(WsValidationType.get().TYPE_ADDRESS.key); +result.string(WsValidationType.get().TYPE_ADDRESS_NOMINATIM.key); \ No newline at end of file diff --git a/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js b/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js index 93426dc98cda1bfc555d22dcbac1929ad4872919..6ab3539198339ca785870777ce0642f0c4e6ba9f 100644 --- a/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js +++ b/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js @@ -1,4 +1,4 @@ -import("WsValidation_lib"); -import("system.result"); - -result.string(WsValidationType.get().TYPE_ZIP.key); \ No newline at end of file +import("WsValidation_lib"); +import("system.result"); + +result.string(WsValidationType.get().TYPE_ZIP_NOMINATIM.key); \ No newline at end of file diff --git a/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js b/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js index b51e1bdca25fd6259183417a6a823361750f2188..3312d2f2f01c895d6887c0cdc653a4246ba1f173 100644 --- a/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js +++ b/entity/Address_entity/entityfields/fulladdressvalidation/children/currentvalue_param/valueProcess.js @@ -1,4 +1,4 @@ import("system.result"); import("system.vars"); - result.string(vars.get("$field.AddressSearch")); \ No newline at end of file +result.string(vars.get("$field.AddressSearch")); \ No newline at end of file diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod index ee8627ef2298007f8266808aec8649c414a1ca9b..7cad7fda51be949fa5472fba40013dc7e371e9d9 100644 --- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod +++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod @@ -39,46 +39,6 @@ <indexsearchIncrementingIndexerBunchSize v="250" /> <indexsearchMaximumHits v="50000" /> <customProperties> - <customBooleanProperty> - <name>addressValidation.enable</name> - <property v="true" /> - </customBooleanProperty> - <customStringProperty> - <name>addressValidation.url</name> - <property>https://services.aditosoftware.local/services/rest/ws_checkAddress</property> - </customStringProperty> - <customStringProperty> - <name>addressValidation.user</name> - <property>Admin</property> - </customStringProperty> - <customStringProperty> - <name>addressValidation.pw</name> - <property>a</property> - </customStringProperty> - <customStringProperty> - <name>addressValidation.countryParamName</name> - <property>country</property> - </customStringProperty> - <customBooleanProperty> - <name>zipCityValidation.enable</name> - <property v="true" /> - </customBooleanProperty> - <customStringProperty> - <name>zipCityValidation.url</name> - <property>https://services.aditosoftware.local/services/rest/ws_checkZipCity</property> - </customStringProperty> - <customStringProperty> - <name>zipCityValidation.user</name> - <property>Admin</property> - </customStringProperty> - <customStringProperty> - <name>zipCityValidation.pw</name> - <property>a</property> - </customStringProperty> - <customStringProperty> - <name>zipCityValidation.countryParamName</name> - <property>country</property> - </customStringProperty> <customBooleanProperty> <name>phoneValidation.enable</name> <description></description> @@ -102,11 +62,11 @@ <property>Country</property> </customStringProperty> <customBooleanProperty> - <name>osm.enable</name> - <property v="true" /> + <name>nominatim.enable</name> + <property v="false" /> </customBooleanProperty> <customStringProperty> - <name>osm.url</name> + <name>nominatim.url</name> <property>https://nominatim.openstreetmap.org/search</property> </customStringProperty> </customProperties> diff --git a/process/DSGVO_lib/process.js b/process/DSGVO_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..1e7b8df70ea110892c5b043df6b2059da835b4cf --- /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/DataCaching_lib/process.js b/process/DataCaching_lib/process.js index 5eee5316c78bcd96d5fcb1f63316cac3d1e2ef34..03cb0d54a4410f6b78a5c339bba7534f0687b1c1 100644 --- a/process/DataCaching_lib/process.js +++ b/process/DataCaching_lib/process.js @@ -11,7 +11,7 @@ import("system.project"); * @class * * @param {String} pIdentifiyingName name to identify the DataCache. This MUST be unique for one data representation (e.g. key-value pair for all Languages with key ISO2-code and value the ISO3-Code). this will affect the storage-name (=name of the global variable on the client for example) - * @param {bool} [pKeepPerLanguage=false] if true the data is kept per locale (different storing for each requested language), false when not (every language is sharin the same stoarge because only untranslated data is kept) + * @param {bool} [pKeepPerLanguage=false] if true the data is kept per locale (different storing for each requested language), false when not (every language is sharing the same stoarge because only untranslated data is kept) * @param {String} [pLocaleOverride=current language] sometimes a special locale is required, use this parameter to specify it * */ @@ -37,7 +37,7 @@ function CachedData(pIdentifiyingName, pKeepPerLanguage, pLocaleOverride) * @param {String} [pLocaleOverride=current language] sometimes a special locale is required, use this parameter to specify it * @param {Function} pDataCallbackFunction function that is called to load the data. this functions gets 2 params: 1. if the data has to be translated 2. the locale to translate * - * @return {Object} returns the data you wanted (of the pDataCallbackFunction) + * @return {CachedData} returns the data you wanted (of the pDataCallbackFunction) * * @static */ diff --git a/process/WsValidation_lib/process.js b/process/WsValidation_lib/process.js index e59e0829e23ab23e0b294600c8ee1fa69db19bc9..0f34bcf034364414e9877eb649cb7608060926e7 100644 --- a/process/WsValidation_lib/process.js +++ b/process/WsValidation_lib/process.js @@ -5,6 +5,8 @@ import("system.vars"); import("system.neon"); import("system.net"); import("system.util"); +import("system.auth"); +import("DataCaching_lib"); /** * Class used for the webservice validation types. @@ -12,18 +14,18 @@ import("system.util"); * Do not create new instances anywhere else than inside of the get-function! * * @param {String} pKey the key-name - * @param {String} pParamName name used by the webservice * @param {String} pWebserviceName name of the webservice. Used to find the correct webservice configuraation * @param {Function} pProcessResultCallback function for processing Webservice-result to the return value * @param {Function} pProcessRequestCallback function for processing Webservice-request + * @param {Object} pAdditionalInfo additional Info. Can be an object or something else. (callback specific) */ -function WsValidationType(pKey, pParamName, pWebserviceName, pProcessResultCallback, pProcessRequestCallback) +function WsValidationType(pKey, pWebserviceName, pProcessResultCallback, pProcessRequestCallback, pAdditionalInfo) { this.key = pKey; - this.paramName = pParamName; this.processResultCallback = pProcessResultCallback; this.processRequestCallback = pProcessRequestCallback; this.webserviceName = pWebserviceName; + this.additionalInfo = pAdditionalInfo; } /** @@ -37,12 +39,12 @@ WsValidationType.get = function(pKey) if (!this._cache) this._cache = { // Address lookups - TYPE_ADDRESS: new WsValidationType("TYPE_ADDRESS", "search", "addressValidation", _processAllAddressLookup, _customRequest), - TYPE_ZIP: new WsValidationType("TYPE_ZIP", "zip", "zipCityValidation", _processAddressLookup, _customRequest), - TYPE_CITY: new WsValidationType("TYPE_CITY", "city", "zipCityValidation", _processAddressLookup, _customRequest), + TYPE_ADDRESS_NOMINATIM: new WsValidationType("TYPE_ADDRESS_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "q"), + TYPE_ZIP_NOMINATIM: new WsValidationType("TYPE_ZIP_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "postalcode"), + TYPE_CITY_NOMINATIM: new WsValidationType("TYPE_CITY_NOMINATIM", "nominatim", _processNominatimAddressLookup, _nominatimRequest, "city"), // Communication validation - TYPE_PHONE: new WsValidationType("TYPE_PHONE", "Number", "phoneValidation", _processCommunicationValidation, _customRequest) + TYPE_PHONE: new WsValidationType("TYPE_PHONE", "phoneValidation", _processCommunicationValidation, _customRequest, "Number") } if (pKey) @@ -50,131 +52,76 @@ WsValidationType.get = function(pKey) return this._cache; - /** - * [UID, - * displayName, - * zip, - * city, - * cityext, - * country, - * district, - * region, - * state, - * street, - * from_bn, // building number - * to_bn, // building number - * lon, - * lat, - * value // pValue - */ - function _processAllAddressLookup(pWsResult, pValue) + function _processCommunicationValidation(pWsResult, pValue) { - var resultAddresses = []; - - // if error, only add the default value else parse the body if (!WsValidationUtils._isError(pWsResult)) { - resultAddresses = JSON.parse(pWsResult.body); + return pWsResult.body; + } + else + { + return pValue; } - - return resultAddresses.map(function(pAddress, pIndex) - { - pAddress[0].value = pValue; - pAddress[0].index = pIndex; - var data = pAddress[0]; - - return [ - JSON.stringify(data), - pAddress[1], - data.zip, - data.city, - data.cityext, - data.country, - data.district, - data.region, - data.state, - data.streat, - data.from_bn, - data.to_bn, - data.lon, - data.lat, - pValue] - }, this); } - /** - * [UID, - * displayName, - * zip, - * city, - * cityext, - * country, - * district, - * region, - * state, - * street, - * from_bn, // building number - * to_bn, // building number - * lon, - * lat, - * value // (the result. e.g. if pType was ZIP, the value is the found zip) - */ - function _processAddressLookup(pWsResult, pValue) + function _processNominatimAddressLookup(pWsResult, pValue) { var resultAddresses = []; - // if error, only add the default value else parse the body - if (!WsValidationUtils._isError(pWsResult)) + if (pWsResult != null) { - resultAddresses = JSON.parse(pWsResult.body); + logging.log(JSON.stringify(pWsResult, null, "\t")) + pWsResult.forEach(function(pPlaceData) { + if (pPlaceData.address == undefined) + pPlaceData.address = {}; + + var city = pPlaceData.address.town; + if (!city) + city = pPlaceData.address.city; + if (!city) + city = pPlaceData.address.village; + if (!city) + city = pPlaceData.address.hamlet; + + var cityext = pPlaceData.address.suburb; + if (!cityext) + cityext = pPlaceData.address.city_district; + + var addrData = [ + pPlaceData.display_name, + pPlaceData.address.postcode, + city, + cityext, + pPlaceData.address.country_code.toUpperCase(), + pPlaceData.address.district, + pPlaceData.address.state_district, + pPlaceData.address.state, + pPlaceData.address.road, + pPlaceData.address.house_number, + pPlaceData.lon, + pPlaceData.lat + ]; + + resultAddresses.push([JSON.stringify(addrData.concat([pValue, pPlaceData.place_id]))].concat(addrData)); + }) } - - return resultAddresses.map(function(pAddress, pIndex) - { - pAddress[0].index = pIndex; - var data = pAddress[0]; - return [ - JSON.stringify(data), - pAddress[1], - data.zip, - data.city, - data.cityext, - data.country, - data.district, - data.region, - data.state, - data.streat, - data.from_bn, - data.to_bn, - data.lon, - data.lat, - data[this.paramName]] - }, this); - } - function _processCommunicationValidation(pWsResult, pValue) - { - if (!WsValidationUtils._isError(pWsResult)) - { - return pWsResult.body; - } - else - { - return pValue; - } + return resultAddresses; } /** * request using a custom webservice */ - function _customRequest(pValue, pCountry) { + function _customRequest(pValue, pCountry) + { if (WsValidationUtils.isWsEnabled(this)) { var userName = project.getPreferenceValue("custom." + this.webserviceName + ".user"); var pw = project.getPreferenceValue("custom." + this.webserviceName + ".pw"); var url = project.getPreferenceValue("custom." + this.webserviceName + ".url"); var countryParamName = project.getPreferenceValue("custom." + this.webserviceName + ".countryParamName"); - + var parameterName = this.additionalInfo; + if (!userName || !pw || !url || !countryParamName) { throw new Error("if the webservice " + this.key + " is enabled, you have to provide also userName, pw, url and countryParamName") @@ -190,7 +137,7 @@ WsValidationType.get = function(pKey) { parameters[countryParamName] = pCountry; } - parameters[this.paramName] = pValue; + parameters[parameterName] = pValue; // call webservice var ret = JSON.parse(net.callRestWebserviceBasicAuth(url, actionType, parameters, null, null, "text/plain", "text/plain", util.DATA_TEXT, util.DATA_TEXT, userName, pw, true)); @@ -208,6 +155,83 @@ WsValidationType.get = function(pKey) } return this.processResultCallback.call(this, null, pValue); } + + function _nominatimRequest(pValue, pCountry) + { + var nominatimCache; + if (WsValidationUtils.isWsEnabled(this)) + { + var parameterName = this.additionalInfo; + + if (!vars.exists("$context.nominatim")) + { + nominatimCache = { + last: "" + } + } + else + { + nominatimCache = JSON.parse(vars.getString("$context.nominatim")); + } + + if (nominatimCache.last == parameterName + pValue + (pCountry ? pCountry : "")) + { + return nominatimCache.data; + } + else + { + nominatimCache.last = parameterName + pValue + (pCountry ? pCountry : "") + + var url = project.getPreferenceValue("custom." + this.webserviceName + ".url"); + + + if (!url) + { + throw new Error("if the webservice " + this.key + " is enabled, you have to provide also the url") + } + + if (pValue) + { + var restConf = net.createConfigForRestWebserviceCall() + .url(url) + .actionType("GET") + .dataTypeAccept("application/json") + .dataTypeJDitoAccept(util.DATA_TEXT) + .dataTypeJDitoSend(util.DATA_TEXT) + .addQueryParameter("format", "json") + .addQueryParameter("addressdetails", "1"); + + // add user input params + if (pCountry) + { + restConf.addQueryParameter("countrycodes", pCountry) + } + + restConf.addQueryParameter(parameterName, pValue) + + + // call webservice + var ret = JSON.parse(net.callRestWebservice(restConf, auth.createConfigForNoAuth())); + + // if error, log the error. But also process the result and let the callback generate the correct default value + if (ret == null) + { + logging.log("error") + logging.log(translate.withArguments("${WEBSERVICE_ERROR} url:%0 status:%1", [url, (ret.hasHttpSuccessStatusCode ? " StatusCode: " + ret.httpStatusCode : "")])); + } + + // different handling of the result per type + nominatimCache.data = this.processResultCallback.call(this, ret, pValue); + vars.set("$context.nominatim", JSON.stringify(nominatimCache)) + return nominatimCache.data; + } + } + } + nominatimCache = {} + nominatimCache.data = this.processResultCallback.call(this, null, pValue); + vars.set("$context.nominatim", JSON.stringify(nominatimCache)) + return nominatimCache.data; + } } /** @@ -242,7 +266,7 @@ WsValidationUtils.validate = function(pValue, pType, pCountry) */ WsValidationUtils.setAddressFields = function(pFieldToSetToValue) { - try + try { var data = JSON.parse(vars.getString("$this.value")); } catch (exception) { @@ -251,17 +275,17 @@ WsValidationUtils.setAddressFields = function(pFieldToSetToValue) return } - _setField("$field.ZIP", data.zip); - _setField("$field.COUNTRY", data.country); - _setField("$field.CITY", data.city); - //_setField("$field.DISTRICT", data.district); not needed currently - _setField("$field.REGION", data.region); - _setField("$field.STATE", data.state); - _setField("$field.ADDRESS", data.streat); + _setField("$field.ZIP", data[1]); + _setField("$field.CITY", data[2]); + _setField("$field.COUNTRY", data[4]); + //_setField("$field.DISTRICT", data[5]); not needed currently + _setField("$field.REGION", data[6]); + _setField("$field.STATE", data[7]); + _setField("$field.ADDRESS", data[8]); if (pFieldToSetToValue) { - _setField(pFieldToSetToValue, data.value) + _setField(pFieldToSetToValue, data[12]) } function _setField(pField, pValue)