diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod index 06653f4727d9ee82f50e883543cc68d511a017d2..9ab3ef6a9fa18ab7a7837ae3e61ecd889efb76d4 100644 --- a/entity/Person_entity/Person_entity.aod +++ b/entity/Person_entity/Person_entity.aod @@ -1464,6 +1464,15 @@ <iconId>NEON:TRASH</iconId> <stateProcess>%aditoprj%/entity/Person_entity/entityfields/deletefunction/stateProcess.js</stateProcess> </entityActionField> + <entityField> + <name>BIRTHDAY</name> + <title>Birthday</title> + <contentType>DATE</contentType> + <resolution>DAY</resolution> + <outputFormat>dd.MM.</outputFormat> + <inputFormat>dd.MM.</inputFormat> + <state>READONLY</state> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -1728,6 +1737,12 @@ <name>STATUS.displayValue</name> <expression>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>BIRTHDAY.value</name> + <expression>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/birthday.value/expression.js</expression> + <isFilterable v="true" /> + <isLookupFilter v="false" /> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/birthday.value/expression.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/birthday.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..f85e341424a1558d5de59cd048fa408511e89812 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/birthday.value/expression.js @@ -0,0 +1,11 @@ +import("system.result"); +import("Sql_lib"); +import("system.SQLTYPES"); + +var maskingUtils = new SqlMaskingUtils(); +var year = new Date().getFullYear().toString(); +var month = maskingUtils.monthFromDate("PERSON.DATEOFBIRTH"); +var day = maskingUtils.dayFromDate("PERSON.DATEOFBIRTH"); +var dateSql = maskingUtils.makeDate(year, month, day); +var timeSql = maskingUtils.cast(dateSql, SQLTYPES.TIMESTAMP); +result.string("case when PERSON.DATEOFBIRTH is null then null else " + timeSql + " end"); diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index fc7918d66d118477455fae249da67ff726a009cb..98fe8cc944264fe98c8ffc7a636128705da4ec35 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -3436,6 +3436,8 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt return "decimal"; case SQLTYPES.DATE: return "date"; + case SQLTYPES.TIMESTAMP: + return "timestamp"; } return null; } @@ -3462,6 +3464,7 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt case SQLTYPES.DECIMAL: case SQLTYPES.INTEGER: case SQLTYPES.DATE: + case SQLTYPES.TIMESTAMP: sqlDataType = _mapDefaults(pTargetDatatype); break; } @@ -3470,6 +3473,9 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt case db.DBTYPE_MYSQL4: switch(pTargetDatatype) { + case SQLTYPES.TIMESTAMP: + sqlDataType = "datetime"; + break; case SQLTYPES.NVARCHAR: case SQLTYPES.VARCHAR: case SQLTYPES.CHAR: @@ -3498,6 +3504,7 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt case SQLTYPES.CHAR: case SQLTYPES.DECIMAL: case SQLTYPES.DATE: + case SQLTYPES.TIMESTAMP: sqlDataType = _mapDefaults(pTargetDatatype); break; } @@ -3506,6 +3513,7 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt switch(pTargetDatatype) { case SQLTYPES.DATE: + case SQLTYPES.TIMESTAMP: case SQLTYPES.DECIMAL: case SQLTYPES.INTEGER: case SQLTYPES.CHAR: @@ -3518,6 +3526,8 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt case db.DBTYPE_SQLSERVER2000: switch(pTargetDatatype) { + case SQLTYPES.TIMESTAMP: + return "datetime"; case SQLTYPES.DATE: case SQLTYPES.DECIMAL: case SQLTYPES.INTEGER: @@ -3939,6 +3949,58 @@ SqlMaskingUtils.prototype.coalesce = function(pFields) return retSql; } +/** + * Converts day, month and year fields into a date + * The parameters can't be null!!! + * + * @param pYear {String} year field + * @param pMonth {String} month field + * @param pDay {String} day field + */ +SqlMaskingUtils.prototype.makeDate = function(pYear, pMonth, pDay) +{ + switch(this.dbType) + { + case db.DBTYPE_POSTGRESQL8: + return "make_date" + "(" + pYear + ", " + pMonth + ", " + pDay + ")"; + case db.DBTYPE_SQLSERVER2000: + return "datefromparts" + "(" + pYear + ", " + pMonth + ", " + pDay + ")"; + + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + return "to_date(lpad(" + pYear + ", 4, '0') || lpad(" + pMonth + ", 2, '0') || lpad(" + pYear + ", 2, '0'), 'YYYY-MM-DD')"; + + // from datestr without filled zeros e.g.: 2000-5-2 + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + var dateFields = [ + this.cast(pYear, SQLTYPES.CHAR, 4), + this.cast(pMonth, SQLTYPES.CHAR, 2), + this.cast(pDay, SQLTYPES.CHAR, 2) + ]; + var dateStr = this.concatWithSeparator(dateFields, "-", false); + return this.cast(dateStr, SQLTYPES.DATE); + + // from datestr with filled zeros e.g.: 2000-05-02 + case db.DBTYPE_DERBY10: + // maskingUtils: workaround + function _castWithZeros(maskingUtils, field, size) { + var casted = maskingUtils.cast(field, SQLTYPES.VARCHAR, size); + var concatenated = maskingUtils.concatenate(["'000'", casted]); + // + 1: derbys substr starts counting at 1, for whatever reason + return "substr(" + concatenated + ", length(" + concatenated + ") - " + size + " + 1)"; + } + var dateFieldsZeroed = [ + _castWithZeros(this, pYear, 4), + _castWithZeros(this, pMonth, 2), + _castWithZeros(this, pDay, 2) + ]; + var dateStrZeroed = this.concatWithSeparator(dateFieldsZeroed, "-", false); + return this.cast(dateStrZeroed, SQLTYPES.DATE); + } +} + /** * functions for various Sql-actions * Do not create an instance of this!