Mobile. Учитывать часовые пояса (актуально для 7.6 и v1) сервера и мобильного устройства
Симптомы
Вопрос по обработке часовых поясов.
В карточке торговой точки есть поля "Воемя доставки от" и "Время доставки до" с типом Время. При создании точки на планшете ставим в них 17:00 и 18:00, в базу они синхронизируются как 14:00 и 15:00. Более того, после синхронизации и на планшете в этих полях оказываются значения 14:00 и 15:00.
В интерфейсе веб-версии они тоже видны как 14:00 и 15:00
Причина
Исправлено в версии 7.8
Решение
Ниже предоставлен фикс, исправляющие проблему без переноса серверных изменений 7.8 по часовым поясам.
Порядок действий следующий:
- создать схему UsrSyncExtension (тип «Модуль») в пользовательском пакете;
- добавить в нее следующий код:
var sysAdminUnitStore = Ext.create("Ext.data.Store", {model: "SysAdminUnit"}); sysAdminUnitStore.setProxy("odata"); sysAdminUnitStore.load({ queryConfig: Ext.create("Terrasoft.QueryConfig", { modelName: "SysAdminUnit", autoSetProxy: false, columns: ["TimeZoneId"] }), filters: Ext.create("Terrasoft.Filter", { property: "Contact", value: Terrasoft.CurrentUserInfo.contactId }), callback: function(records, operation, success) { if (success === true && records.length > 0) { var firstRecord = records[0]; var timeZoneCode = firstRecord.get("TimeZoneId"); if (!Ext.isEmpty(timeZoneCode)) { var timeZoneStore = Ext.create("Ext.data.Store", {model: "TimeZone"}); timeZoneStore.setProxy("odata"); timeZoneStore.load({ queryConfig: Ext.create("Terrasoft.QueryConfig", { modelName: "TimeZone", autoSetProxy: false, columns: ["Offset"] }), filters: Ext.create("Terrasoft.Filter", { property: "Code", value: timeZoneCode }), callback: function(timeZoneRecords, timeZoneOperation, timeZoneSuccess) { if (timeZoneSuccess === true && timeZoneRecords.length > 0) { var timeZoneRecord = timeZoneRecords[0]; var offset = timeZoneRecord.get("Offset"); var offsetValue = 0; if (!Ext.isEmpty(offset)) { offset = offset.replace("GMT", ""); if (!Ext.isEmpty(offset)) { var sign = (offset.substring(0, 1) === "-") ? 1 : -1; var hours = parseInt(offset.substr(1, 2)); var minutes = parseInt(offset.substr(4, 2)); offsetValue = sign * (hours * 60 + minutes); } } Terrasoft.Configuration.CurrentUserTimeZoneOffset = offsetValue; } }, scope: this }); } } }, scope: this }); if (!Terrasoft.Configuration.processColumn) { Terrasoft.Configuration.processColumn = Terrasoft.OData.ResponseParser.processColumn; } Terrasoft.OData.ResponseParser.processColumn = function(data, queryConfig, record, columnName) { var model = record.self; var columnConfig = model.ColumnConfigs.get(columnName); var columnValue = data[columnName]; if ((columnConfig.columnType === Terrasoft.ColumnTypes.date || columnConfig.columnType === Terrasoft.ColumnTypes.datetime) && !Ext.isEmpty(Terrasoft.Configuration.CurrentUserTimeZoneOffset)) { if (columnValue.indexOf("/") !== -1) { var timeZoneOffset = Terrasoft.Configuration.CurrentUserTimeZoneOffset; columnValue = new Date(parseInt(columnValue.substr(6))); columnValue = new Date(columnValue.getTime() + timeZoneOffset * 60 * 1000); } else { columnValue = Terrasoft.util.convertISOStringToDate(columnValue); } record.set(columnName, columnValue); } else { Ext.callback(Terrasoft.Configuration.processColumn, Terrasoft.OData.ResponseParser, arguments); } };
- добавить в текущий пакет манифест мобильного приложения (манифест соответствующего рабочего места) и в нем прописать схему UsrSyncExtension, а именно добавить ее в SyncExtensions и CustomSchemas:
"SyncExtensions": [ "UsrSyncExtension" ], "CustomSchemas": [ "UsrSyncExtension" ],
Что делает вышеуказанный код:
- получает из SysAdminUnit часовой пояс текущего пользователя;
- при получении дат во время синхронизации использует этот часовой пояс.