From 49af5b2d374105c4b834ebda183f9d335c936ad3 Mon Sep 17 00:00:00 2001 From: Johannes Hoermann <j.hoermann@adito.de> Date: Tue, 20 Aug 2019 10:23:25 +0200 Subject: [PATCH] Comment DataPrivacy_lib --- process/DataPrivacy_lib/process.js | 178 +++++++++++++++++++++++++---- 1 file changed, 154 insertions(+), 24 deletions(-) diff --git a/process/DataPrivacy_lib/process.js b/process/DataPrivacy_lib/process.js index 0fedbf88b8..0d8eed3748 100644 --- a/process/DataPrivacy_lib/process.js +++ b/process/DataPrivacy_lib/process.js @@ -86,10 +86,17 @@ DataPrivacyType.get = function(pKey) /** * Helper function to get personal data. + * It is used by some callback functions below + * + * @param {String} pContactId + * @param {String} pContactIdSaved + * @param {String} pFields the fields needed from the Contact (person) + * + * @return {Object} containing all rows */ - function _selectPersonal(pContactId, pContactIdSaved, fields) + function _selectPersonal(pContactId, pContactIdSaved, pFields) { - fields.push("CONTACTID"); + pFields.push("CONTACTID"); if (pContactIdSaved) pContactId = pContactIdSaved; @@ -98,10 +105,39 @@ DataPrivacyType.get = function(pKey) .entity("Person_entity") .provider("Contact") .uid(pContactId) - .fields(fields); + .fields(pFields); return entities.getRow(entityConfig); } + + /*********** + * These functions are used as callback by DSGVO-functions. + * Parameters: + * - The first param is always the contactId of the contact the dataPrivacyInfo is needed for + * - The second param is the Id of the corresponding dataset. + * It is the ID saved in the DSGVO-table and is the ID returned by the these helper fuctions. + * (see Return below) + * Can be undefined, if all dataPrivacy Informations are fetched. + * + * Return: + * the callbacks should return an array of objects: + * [{ + * value: names, + * id: persData.CONTACTID + * }, { + * ... + * }] + * + * !! If the Second param is NOT UNDEFINED, the array should only contain one element !! + ***********/ + /** + * Callback function to fetch the names + * + * @param {String} pContactId + * @param {String} [pContactIdSaved=undefined] + * + * @return {Object[]} + */ function _getName(pContactId, pContactIdSaved) { // Use PersonId as ID, since the data comes from the person @@ -126,6 +162,14 @@ DataPrivacyType.get = function(pKey) }] } + /** + * Callback function to fetch the birthday of a person + * + * @param {String} pContactId + * @param {String} [pContactIdSaved=undefined] + * + * @return {Object[]} + */ function _getBirthday(pContactId, pContactIdSaved) { // Todo Format or set content dsgvotype @@ -137,10 +181,17 @@ DataPrivacyType.get = function(pKey) }] } + /** + * Callback function to fetch the Addresses of a Person + * + * @param {String} pContactId + * @param {String} [pAddressId=undefined] + * + * @return {Object[]} + */ function _getAddress(pContactId, pAddressId) { // TODO: update and fix Address_lib and use it (and remove format-functions in PostalAddress_lib) - var entityConfig = entities.createConfigForLoadingRows() .entity("Address_entity") .fields(["ADDRESSID", "ADDRESS", "ADDRESSADDITION", "ADDRIDENTIFIER", "BUILDINGNO", "ZIP", "CITY", "COUNTRY", "DISTRICT", "REGION", "PROVINCE"]); @@ -168,6 +219,14 @@ DataPrivacyType.get = function(pKey) return addrData; } + /** + * Callback function to fetch the Communication addresses of a Person + * + * @param {String} pContactId + * @param {String} [pCommunicationId=undefined] + * + * @return {Object[]} + */ function _getCommunication(pContactId, pCommunicationId) { var entityConfig = entities.createConfigForLoadingRows() @@ -193,6 +252,14 @@ DataPrivacyType.get = function(pKey) }); } + /** + * Callback function to fetch the Attributes of a Person + * + * @param {String} pContactId + * @param {String} [pAttributeId=undefined] + * + * @return {Object[]} + */ function _getAttribute(pContactId, pAttributeId) { var attributeData = []; @@ -225,6 +292,14 @@ DataPrivacyType.get = function(pKey) */ function DataPrivacyUtils() {} +/** + * Selects the dsgvo-data from the DSGVO table. It already resolves the DSGVO-type display value + * + * @param {String} pContactId + * @param {SqlCondition} [pFilterCond=undefined] Sql condition object containing additional conditions + * + * @return {String[][]} the DSGVO data + */ DataPrivacyUtils.getDSGVO = function(pContactId, pFilterCond) { var cond = SqlCondition.begin().andPrepare("DSGVO.CONTACT_ID", pContactId); @@ -250,14 +325,23 @@ DataPrivacyUtils.getDSGVO = function(pContactId, pFilterCond) } /** - * If filter conditin is provided, NO inserts are done + * collects all DSGVO-data of a person + * + * This function not only selects the data: + * - It deletes all no longer existing dsgvo-entries. + * - If NO FILTER is provided, it inserts all found data not already existing in DSGVO-table into the DSGVO-table. + * + * @param {String} pContactId + * @param {SqlCondition} [pFilterCond=undefined] Sql condition object containing additional conditions + * + * @return {String[][]} the collected dsgvo data */ DataPrivacyUtils.collectAll = function(pContactId, pFilterCond) { var contactDSGVO = DataPrivacyUtils.getDSGVO(pContactId, pFilterCond); // copy data (with .slice()) as we iterate through it and we should not add values while doing this - // NOTE that the arrays inside of contactDSGVO still point to the same arrays as in returnDSGVOData + // NOTE that the arrays inside of contactDSGVO still point to the same arrays as in returnDSGVOData (ByRefference!) // // --> contactDSGVO[dat][4] = pRow.value; WILL CHANGE returnDSGVOData[dat][4] ALSO! // (Yes I could also slice each array in contactDSGVO to returnDSGVOData but this would add overhead which is not needed :-) @@ -342,7 +426,11 @@ DataPrivacyUtils.collectAll = function(pContactId, pFilterCond) } /** - * Notify the user to update the data privacy informations + * Notify the user to update the data privacy informations. + * It is only displayed if it is a Person. + * + * @param {String} pContactId the current contactId + * @param {Boolean} pShowMessage if false: nothing happens */ DataPrivacyUtils.notifyNeedDataPrivacyUpdate = function(pContactId, pShowMessage) { @@ -359,6 +447,36 @@ DataPrivacyUtils.notifyNeedDataPrivacyUpdate = function(pContactId, pShowMessage } } +/** + * Check if all data also contains the DSGVO-Informations + * + * Note: this function requires that all pFields in the DSGVO table are updated (via DataPrivacyUtils.collectAll()) + * Otherwise there may be fields in DSGVO which do not exist anymore in the person or some are missing. + * @param {String} pContactId the current contactId + * + * @return {Boolean} true if everything is filled correctly + */ +DataPrivacyUtils.checkAllFilled = function(pContactId) +{ + var countNotFilled = db.cell(SqlCondition.begin() + .andPrepare("DSGVO.CONTACT_ID", pContactId) + .andSqlCondition(SqlCondition.begin() + .or("STATUORITYSOURCE is null") + .or("PURPOSE is null") + .or("VALID_TO is null")) + .buildSql("select count(*) from DSGVO", "1=2")) + + return countNotFilled == "0"; +} + +/** + * collects the data needed for export functions (e.g. reports, Excel exports, ...) + * + * @param {String} pContactId the current contactId for which the data is exported + * @param {String} pLocale the locale to translate to + * + * @return {String[][]} the data + */ DataPrivacyUtils.dataForExport = function(pContactId, pLocale) { var entity = "DSGVO_entity"; @@ -385,6 +503,12 @@ DataPrivacyUtils.dataForExport = function(pContactId, pLocale) })]; } +/** + * generate a CSV and provide it as download + * + * @param {String} pContactId the current contactId for which the data is exported + * @param {String} pLocale the locale to translate to + */ DataPrivacyUtils.downloadCSV = function(pContactId, pLocale) { var data = DataPrivacyUtils.dataForExport(pContactId, pLocale); @@ -398,27 +522,30 @@ DataPrivacyUtils.downloadCSV = function(pContactId, pLocale) neon.download(util.encodeBase64String(csvTable), "data_pricacy.csv"); } +/** + * @return {String} the name of the DSGVO disclosure report + */ DataPrivacyUtils.DisclosureReportName = function() { return "DSGVO_Disclosure_report"; } /** - * Note: this function requires that all fields in the DSGVO table are updated (via DataPrivacyUtils.collectAll()) - * Otherwise there may be fields in DSGVO which do not exist anymore in the person or some are missing. + * Opens a DSGVO report + * + * @param {String} pContactId the current contactId for which the data is exported + * @param {String} pReportName the name of the report to load. + * @param {Object} pDSGVOInfo Additional data needed by the reports: + e.g. { + datasource: rowdata["DSGVOINFO.DATASOURCE"], + transmission: rowdata["DSGVOINFO.TRANSMISSION"], + recipient: rowdata["DSGVOINFO.RECIPIENT"], + garantees: rowdata["DSGVOINFO.GUARANTEE"], + requestDate: vars.get("$field.dateRequest"), + deadline: vars.get("$field.deadline"), + deadlineDate: vars.get("$field.dateDeadline") + } + * @param {String} pLocale the locale to translate to */ -DataPrivacyUtils.checkAllFilled = function(pContactId) -{ - var countNotFilled = db.cell(SqlCondition.begin() - .andPrepare("DSGVO.CONTACT_ID", pContactId) - .andSqlCondition(SqlCondition.begin() - .or("STATUORITYSOURCE is null") - .or("PURPOSE is null") - .or("VALID_TO is null")) - .buildSql("select count(*) from DSGVO", "1=2")) - - return countNotFilled == "0"; -} - DataPrivacyUtils.openReport = function(pContactId, pReportName, pDSGVOInfo, pLocale) { if (pLocale == undefined) @@ -528,13 +655,15 @@ Muster-Datenschutzberatung"; //////////////////////////////////////////////////////////////////////// -// Deprecated functions: +// Deprecated functions: they need to be updated or rewritten to Adito 2019 +// Currently not used /** * makes selected data from a private contact anonymous * * @param pPersId - * @param pContactId + * @param pContactId + * @deprecated */ DataPrivacyUtils.dsgvoMkDataAnonymous = function(pPersId, pContactId) { @@ -683,6 +812,7 @@ DataPrivacyUtils.dsgvoMkDataAnonymous = function(pPersId, pContactId) * * @example DataPrivacyUtils.anonymizeText("Buchstabe") * @exampleresult B*******e + * @deprecated */ DataPrivacyUtils.anonymizeText = function(pText) { -- GitLab